OpenWrt 通过 SSH 连到终端后,默认文字都是白色,内容多起来之后不便于定位和区分命令位置。本文介绍如何为命令行界面的前缀部分设置颜色。
命令行前缀,即提示字符串 (Prompt String),由 shell 下的变量PS1
定义。PS1
在 GNU 官网的介绍可在此查看。我们要做的,实际上就是给PS1
加颜色。
OpenWrt 使用的是 ash shell,在文件/etc/profile
中定义了PS1
的默认值:
在终端中输入echo $PS1
,也可以得到PS1
的默认值:
上面的\[\e]0;\u@\h: \w\a\]
部分先忽略(\[
和\]
包围的部分都是在终端不会显示的,至于为什么有这一串字符串没有深究),关键部分在后面的\u@\h:\w\$
。这几个特殊控制符定义了当前提示字符串的格式:
\u
代表 username\h
是 hostname\w
是当前路径,且用户$HOME
目录简化为~
\$
输出一个 # 字符(root 用户)或 $ 字符(普通用户)
合起来之后,上面的控制符组合渲染到命令行即可显示为:root@OpenWrt:~#
。
其它所有的特殊控制符可以参阅 GNU 官方介绍或这个教程,这里简单贴个图:
了解了提示字符串的本质,接下来要做的就是给它加上颜色。而这是通过ANSI 转义序列实现的。设置颜色的语法为:
\e[nm # 注意 n 和 m 是两个部分
其中n
是一个或多个数字,若包含多个数字,相互之间用;
隔开;m
是由 ANSI 规定的一个固定的字符。具体的颜色设置以及一些字体的变化,都是通过这里的n
来规定的。n
的具体选值有三部分:字体、前景色和背景色。
字体:
注意上面有一些控制代码并不是广泛支持的,在不同终端可能效果会有差异,需要实际测试一下。
前景色和背景色:
由上表可见,同一个颜色在不同终端下的具体色彩取值可能不同,另外同一个颜色的前景色代码和背景色代码也是不一样的。
正由于字体、前景色和背景色分别拥有独立的代码,它们之间可以自由地产生不同的组合,如:\e[1;32;40m
,代表绿色粗体。
此外需要注意的点:
- 三个数字顺序可以互换,不影响解析
- 保持默认的选项可以缺省不写,如只想把字体变为绿色,可输入
\e[32m
- 全部缺省,效果与 0 相同,即
\e[0m
或\e[m
,代表重置所有属性
在这篇教程中作者测试了在某终端中 0 到 50 的实际效果,可以参考:
有些教程会在颜色控制符前后加上一对方括号\[
和\]
,实测可加可不加,效果一样。
下面具体介绍一个例子:
export PS1='\[\e[33;1m\]\u@\[\e[32;1m\]\h \[\e[36;1m\]\w\[\e[34;3m\]\$ \[\e[0m\]'
在终端直接输入上面的代码即可变色,但是退出后效果消失(永久改变设置的方式在后面讲),效果如下:
这段代码中:
- 基础部分是
\u@\h \w\$
\[\e[33;1m\]
将后面部分的颜色改为黄色加粗\[\e[32;1m\]
将后面部分的颜色改为绿色加粗\[\e[36;1m\]
将后面部分的颜色改为青色加粗\[\e[34;1m\]
将后面部分的颜色改为蓝色加粗- 最后
\[\e[0m\]
恢复默认设置,若无这一部分,则后面输入的具体命令将带同样的颜色
最后记录一下我的配色:
export PS1='\[\e[32;1m\]\u@\h \[\e[36;1m\]\w\[\e[m\]\$ \[\e[m\]'
要永久改变配色,将这行命令追加写入前面提到的配置文件/etc/profile
即可:
echo "export PS1='\[\e[32;1m\]\u@\h \[\e[36;1m\]\w\[\e[m\]\$ \[\e[m\]'" >> /etc/profile
最后的效果:
这一修改提示字符串配色的方式不局限于 OpenWrt,其它 Linux 系统原理均相同,具体的配置文件地址略有区别而已。
参考阅读: