一 修改配置文件
shell 彩色配置出现在 bash 的个人配置文件 ~/.bashrc 或者是全局配置文件 /etc/bashrc 里面。 可以通过bashrc 里面的 PS1 变量来设置提示符的外观。
一般默认的情况下.bashrc里面应该是:
~/.bashrc
export PS1=' \u@\h:\w\$ '
上面的意思是:用户@主机:当前目录 $
-->这也是大家都非常熟悉的shell提示符 。
转义序列
要是通过彩色化提示符来增加个性化,就要用到转义序列。 转义序列就是一个让 shell 执行一个特殊步骤的控制指令。 转义序列通常都是以 ESC 开头(这也是它的命名原因)。 在 shell 里表示为 ^[ .这种表示法需要一点时间去适应, 也可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27,等于用八进制表示的 033)。
要直接在 shell 里面输入转义序列我们需要先按 ctrl-v:CTRL-v ESC。
下面进入主题,说下该如何用shell的颜色。我用我自己的shell颜色设置详细说明.
代码:
PS1="\[\033[1;32;40m[\033[0;32;40m\u@\h:\033[1;35;40m\w\033[1;32;40m]\033[1;31;40m\$\033[1;32;40m \]"
最外边的"\[ \]"是为了把转义序列的字符串括起来,防止转义序列的文本显示在 shell 里占用太多的空间。
\033 声明了转义序列的开始,然后是 [ 开始定义颜色。 后面的 0 定义了默认的字体宽度,接着的中间的数字定义字符颜色。最后面的数字定义了字符背景色。字母m是定义本身所必须的,字母m后面的字符就是你想改变的字符了。
可选颜色:红色、绿色、黄色、蓝色、洋红、青色和白色。 他们对应的颜色代码是:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)。
用同样色方法设置背景色,不过要把第一个数字“3”替换成“4”, 例如 40、41、42、43、44、45、46、47。
比如上面我的定义中: 最后显示的结果是在$号之前的字符全部用一个浅绿色的中括弧扩起来。$字符 显示为红色。后面的输入显示为高亮浅绿色。在括弧里面,用户名@主机显示为深绿色,路径显示为洋红。
用代码解释:
Ps1 ="\[ -------------> 最外面的括弧
\033[1;32;40m[
----> 定义最右边的" [ " ;
1:字体宽度,好像有加亮功能.
32:字符颜色。32表示绿色。
40:背景色,40表示黑色。
\033[0;32;40m\u@\h:
--------->定义右边的 \u@\h: 这几个字符颜色。
0: 默认字体宽度。
32:字符颜色。绿色。
40: 背景颜色。黑色。
\033[1;35;40m\w
---------> 定义右边的 \w (路径颜色) 。
1:字符宽度。加亮。
35:字符颜色。洋红。
40:背景色。黑色。
\033[1;32;40m]
---------> 定义右边的 ] 字符。跟前面的 [ 字符使用同一效果。
\033[1;31;40m\$
---------> 定义了 $ 字符 为红色。转义字符,所以前面加了 \ .
颜色都跟前面差不多。相信大家都发现规律了。
\033[1;32;40m
----------> 这个定义了你在命令行要输入命令显示的颜色。
\]"
-----------> 字符串结束括弧。
这个就是上面例子的详细定义内容。
其实我的是没有关闭颜色转义序列,让自己输入的字符也改变颜色,整天看这黑白屏幕不爽哇!!如果不想改变输入颜色的话,用 \033[0m 关闭转义序列, \033[0m 是 shell 的默认颜色。按照上面的例子来说就是在 \]" 前面加上 \033[0m 即可。
二 shell下的实现方法先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子:
echo -e "\033[32mHello, world!"
当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续 说。echo命令-e选项的作用是激活终端对反斜线转义符(即\)的解释。引号内\033用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后 边的[32m就是将前景色设置为绿色,字母m表示设置的属性类别,数字代表属性值。设置可以单独使用,例如:
echo -e "\033[0m"
这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了?
理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项:
--------------------------------------------------------------------------
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m 至 \33[37m 设置前景色
\033[40m 至 \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
--------------------------------------------------------------------------
各数字所代表的颜色如下:
字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下:
echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"
这行命令首先\033[20;1H将光标移动到终端第20行第1列,之后的\033[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后\033[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。
通过以上各种命令的组合就可以实现对终端输出地复杂控制。
三、如何在C编程中实现?
理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:
int color = 32;
printf("\033[20;1H\033[1;4;%dmHello, world.\033[0m", color);
这个例子类似上边shell中最后那个例子,只是这里颜色值通过变量color来指定(当然,也可以直接指定)。