三、添加颜色
大多数终端都会响应某些非打印字符序列,来控制光标位置、字符属性(如:颜色、粗体、文本闪烁)等内容。
1.字符颜色
(1)是什么?
字符颜色是由发送到终端仿真器的一个 ANSI 转义代码来控制的,该转义代码嵌入到要显示的字符流中。(简单来讲,字符颜色就是1个ANSI转义代码)
控制代码不会“ 打印 ”到屏幕上,而是被终端解释为一条指令。在shell提示符中使用的转义字符表中可看到,“\ [ ” 和 "\ ]"这两个序列用来封装非打印字符串。
① 字符颜色(1个ASNI转义代码)组成
1个 ANSI 转义代码以八进制 033开始(该代码由转义键[escape key]产生),后面跟着1个可选的字符属性,之后是1条指令。
Ⅰ.示例
将文本颜色设置为正常(attribute=0)、黑色的代码是 \033[0;30m 。
(正常所代表的0,在转移代码中就是 “ ; ” 前的0)
② 设置文本颜色的转义序列(准)
以下列出了可用的文本颜色。
Ⅰ.注意:
这些颜色分为 2 组,区别在于是否应用了粗体(bold)属性(1),这个属性使得色彩分为深色和浅色。
字符序列 | 文本颜色 |
---|---|
\033[0;30m | 黑色 |
\033[0;31m | 红色 |
\033[0;32m | 绿色 |
\033[0;33m | 棕色 |
\033[0;34m | 蓝色 |
\033[0;35m | 紫色 |
\033[0;36m | 青色 |
\033[0;37m | 浅灰色 |
\033[1;30m | 深灰色 |
\033[1;31m | 淡红色 |
\033[1;32m | 淡绿色 |
\033[1;33m | 黄色 |
\033[1;34m | 淡蓝色 |
\033[1;35m | 淡紫色 |
\033[1;36m | 淡青色 |
\033[1;37m | 白色 |
③ 设置文本背景颜色的转义序列
使用以下代码可以设置文本的背景颜色,背景颜色不支持粗体属性。
字符序列 | 背景颜色 |
---|---|
\033[0;40m | 黑色 |
\033[0;41m | 红色 |
\033[0;42m | 绿色 |
\033[0;43m | 棕色 |
\033[0;44m | 蓝色 |
\033[0;45m | 紫色 |
\033[0;46m | 青色 |
\033[0;47m | 淡灰色 |
(2)怎么做?
以下通过几个实例来实现对字符颜色的改变。
① 红色提示符
将相应的转义代码插入到提示符的开端。
PS1="\[\033[0;31m\]<\u@\h \W>\$ "
# 显示<用户名@不带域名的主机名 当前工作目录最后一部分>$ ,最后的空格会将$与光标分隔开
可以看到,提示符已经变成红色,但是此时用户输入的文本也变成了红色。
要修复这个问题,可以在提示符的末尾插入另一条转义代码,以通知终端仿真器恢复到原来的颜色。
PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]"
# \033[0m 这段代码告诉终端仿真器恢复到原来的颜色。
② 红色背景的提示符
通过为第一个转义代码做些许修改,就可创建带有红色背景的提示符。
PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\]"
尝试下其他颜色的代码,看看分别能创造出何样的提示符。
(3)注意
文本除了正常(0)和粗体(1)属性外,还可以设置为下划线(4)、闪烁(5)和斜体(7)。
但为了维持好的品味,许多终端仿真器拒绝使用闪烁属性。
四、移动光标
转义代码也可以用来定位光标。比如在提示符出现的时候,这些转义代码通常用来在屏幕的不同位置(比如屏幕上方的一角)显示一个时钟或其它信息。
1.光标移动转义序列
字符序列 | 动作 |
---|---|
\033[1;cH | 将光标移动至 1 行 c 列。 |
\033[nA | 将光标向上移动 n 行。 |
\033[nB | 将光标向下移动 n 行。 |
\033[nC | 将光标向前移动 n 个字符。 |
\033[nD | 将光标向后移动 n 个字符。 |
\033[2J | 清空屏幕并将光标移动至左上角(即第0行第0列) |
\033[K | 清空当前光标位置到行末的内容。 |
\033[s | 存储当前光标位置。 |
\033[u | 恢复之前存储的光标位置。 |
(1)示例
通过使用这些代码,用户可以构建这样的一条提示符。
每当提示符出现时,屏幕的上方会绘制出一个红色的横条,横条中有用黄色文本显示的时间。
用于提示符的编码就是以下这一个看起来很可怕的字符串:
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "
# 这个一定要好好理解,其实就是多个转移字段在一起,分解开看就很容易。
① 复杂提示符的分解
以下是对上面这个字符串的每一部分进行分析。
字符序列 | 动作 |
---|---|
\ [ | 开始一个非打印字符序列。其真正目的是为了让 bash 正确计算可见提示符的长度。如果没有该字符,命令行编辑功能无法正确定位光标。 |
\033[s | 存储当前光标位置。在屏幕的顶端横条绘制完成并显示时间后,读取并使光标返回此位置。(需要注意的是,一些终端仿真器不支持该代码。) |
\033[0;0H | 将光标移动至 0 行 0 列(左上角)。 |
\033[0;41m | 将背景颜色设置为红色。 |
\033[K | 清空光标当前位置(左上角)到行末的内容。因为现在背景颜色已经是红色了,所以清空后的行就是红色,也就绘制出了红色的横条。(需要注意的是:清空行的内容并不会改变光标的位置,光标仍处于左上角) |
\033[1;33m | 将文本颜色设置为黄色。 |
\t | 显示当前时间。尽管这是一个可打印的元素,但是还是将其包含在提示符非打印部分中,这是因为 bash 在计算可见提示符的长度时,不应当将其计算在内。 |
\033[0m | 关闭颜色。对文本和背景均有效。 |
\033[u | 恢复之前存储的光标位置。 |
\ ] | 结束非打印的字符序列。 |
<\u@\h \W>$ | 提示符字符串。 |
五、保存提示符
很显然,用户不会想要每次都输入这样一长串代码,所以就需要将提示符存储在某个地方。
将提示符添加到 .bashrc文件中是一个一劳永逸的解决办法,也就是将以下两行代码添加到文件中。
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "
export PS1
网友评论