一卓的博客

怕什么真理无穷,
进一寸有一寸的欢喜。

0%

Linux 上设置终端输出内容的颜色

在 Linux 系统上,打开终端,一般默认的颜色是黑白。这样颜色比较单调,有时我们需要在终端上打印出一些提示语,需要使用不同的颜色,那怎么设置终端输出内容的颜色呢?本文将详细讲解

颜色控制原理 ANSI 转义序列

ANSI 转义序列是一种带内信号的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以 ESC 转义字符[字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。

终端颜色就是 ANSI 转义序列应用中的一个。

ANSI 控制序列的组成

ANSI 控制序列 三部分构成:前置引导, CSI 控制序列,结束符号
ansi

前置引导

前置引导器就是由 ESC 的 ASCII 码值, 如\033,这告诉终端,这是个控制命令,终端就不会把这个引导符号后面的文本当字符串来解释。

ESC 的转义符号有下面3个

1
2
3
\033  // 推荐 八进制 ASCII
\0x1b // 推荐 十六进制 ASCII
\e // 有些shell下可以使用

CSI 控制序列

这个 CSI 序列主要是控制输出样式的,比如颜色, 光标等……
这个控制命令是个 CSI 序列, 通常由 ; 分割的指令, 通常指令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[<PREFIX>];[<FONT COLOR>];[<BACKGROUND COLOR>]
PREFIX 可选参数:
0 终端默认设置(黑底白字)
1 高亮显示
4 使用下划线
5 闪烁
7 反白显示
8 不可见

FONT COLOR 和 BACKGROUND COLOR 可选参数:
字色 FONT COLOR 背景色 BACKGROUND COLOR 颜色
------------------------------------------------
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色

结束符号

最后,m 表示控制序列的结尾,因此终端知道在 m 之后文本将不会解释为颜色。

Linux 终端打印一般使用 shell 命令中的 echo 和 printf。我们这里就使用 echo 来设置颜色

来看一个例子:
echo

上图 \033[0;31m 未输入操作名 \033[0m 就是一个 ANSI 控制序列 ,将会呈现黑底红字的效果,在 CSI 与 其他组件之间并不需要空格,这 里的空格仅仅是为了方便阅读。
末尾的\033[0m 将会清空样式, 由于 CSI 将会影响之后的所有输出, 如果不清空的话, 会导致之后的所有输出都具有此样式。
第二条命令为末尾未添加 \033[0m 的效果

"\e[1;31;47m Hello World \e[0m"将会呈现为白底红字的效果如下:

echo

参考文档

维基百科:https://en.wikipedia.org/wiki/ANSI_escape_code
简书:https://www.jianshu.com/p/790fc612aaa5

请作者喝杯咖啡吧