在 Linux 系统上,打开终端,一般默认的颜色是黑白。这样颜色比较单调,有时我们需要在终端上打印出一些提示语,需要使用不同的颜色,那怎么设置终端输出内容的颜色呢?本文将详细讲解
颜色控制原理 ANSI 转义序列
ANSI 转义序列是一种带内信号的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以 ESC 转义字符
和[
字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。
终端颜色就是 ANSI 转义序列应用中的一个。
ANSI 控制序列的组成
ANSI 控制序列 三部分构成:前置引导, CSI 控制序列,结束符号
前置引导
前置引导器就是由 ESC
的 ASCII 码值, 如\033
,这告诉终端,这是个控制命令,终端就不会把这个引导符号后面的文本当字符串来解释。
ESC
的转义符号有下面3个
1 | \033 // 推荐 八进制 ASCII |
CSI 控制序列
这个 CSI 序列主要是控制输出样式的,比如颜色, 光标等……
这个控制命令是个 CSI 序列, 通常由 ;
分割的指令, 通常指令格式如下:
1 | [<PREFIX>];[<FONT COLOR>];[<BACKGROUND COLOR>] |
结束符号
最后,m
表示控制序列的结尾,因此终端知道在 m
之后文本将不会解释为颜色。
Linux 终端打印一般使用 shell 命令中的 echo 和 printf。我们这里就使用 echo 来设置颜色
来看一个例子:
上图 \033[0;31m 未输入操作名 \033[0m
就是一个 ANSI 控制序列 ,将会呈现黑底红字的效果,在 CSI 与 其他组件之间并不需要空格,这 里的空格仅仅是为了方便阅读。
末尾的\033[0m
将会清空样式, 由于 CSI 将会影响之后的所有输出, 如果不清空的话, 会导致之后的所有输出都具有此样式。
第二条命令为末尾未添加 \033[0m
的效果
"\e[1;31;47m Hello World \e[0m"
将会呈现为白底红字的效果如下:
参考文档
维基百科:https://en.wikipedia.org/wiki/ANSI_escape_code
简书:https://www.jianshu.com/p/790fc612aaa5