专栏首页初见Linux12-2 提示符添加颜色及光标移动

12-2 提示符添加颜色及光标移动

三、添加颜色

大多数终端都会响应某些非打印字符序列,来控制光标位置、字符属性(如:颜色、粗体、文本闪烁)等内容

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 13-5 vi查找和替换

    见贤思齊
  • 4.网络层-ICMP

    见贤思齊
  • 5.文件管理

    见贤思齊
  • Linux---Shell脚本字符显示特殊颜色效果

    院长技术
  • printf不一样的玩法

    DeROy
  • ANSI控制码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    sofu456
  • shell脚本输出带颜色字体

    yaohong
  • shell中echo的显示格式 (r5笔记第58天)

    有时候使用shell就是为了达到简化工作的目的,其实在shell本身强大的功能下,其实还可以更好一些,功能再好,如果界面有时候不够美观,清晰,效果也会受到直接影...

    jeanron100
  • Python终端输出打印彩色字体的方法

    一  实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。    转义序列是以ESC开头,即用\033来完成(ESC的A...

    用户1214487
  • Python:输出带颜色的字

    转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033)。

    弄啥嘞

扫码关注云+社区

领取腾讯云代金券