Linux控制台输出多种样式彩色字符及原理解析

1. 前言

之前在做MIT6.824的实验的时候,有助教资料在说明如何输出彩色的字符来让日志更加清晰。所以对Linux控制台如何输出多种样式的彩色字符以及它的原理产生了兴趣,学习了之后在这里记录一下。

2. 原理

Linux控制台输出彩色字符的原理是通过ANSI转义码来实现的。ANSI转义码是一种控制字符,用于控制文本终端的行为。包括但不限于控制光标位置、颜色、清屏等。

下面这是一段输出蓝色字符的控制台代码:

1
echo -e "\033[34mHello\033[0m"

在vscode的终端显示结果如下:

输出结果

下面对这段代码逐个进行解析:

  • -e:表示开启转义字符的解析,如果不加这个参数,\033会被当做普通字符输出。
  • \033:表示转义字符的开始。在ASCII字符集中,十进制的33代表了Escape字符(也可以写为\033或\x1B),它通常用于表示控制序列的开始。
  • [34m:表示设置颜色。34代表蓝色,m表示设置颜色的转义序列的结束。
  • [0m:表示重置为默认设置。0代表默认设置,m表示设置颜色的转义序列的结束。如果不设置为默认设置,后续的字符都会被设置为蓝色。

3. 转义代码

主要与输出字符格式相关的转义代码的格式如下,可以单独使用也可以利用;来混合使用:

1
\033[显示方式;前景色;背景色m

下面是一些常用的转义代码:

1. 显示方式

代码及对应显示方式如下:

  • 0:所有属性关闭,恢复到默认值。
  • 1:粗体或者高亮。
  • 2:弱化(低亮)。(不是所有终端都支持)
  • 3:斜体。(不是所有终端都支持)
  • 4:下划线。
  • 5,6:闪烁。(不是所有终端都支持)
  • 7:反显,即前景色和背景色交换。
  • 8:隐藏字符。
  • 9:删除线。(不是所有终端都支持)
  • 10:将文本的前景色设置为默认颜色。
  • 21:双下划线。(不是所有终端都支持)

在vscode的终端显示结果如下:

显示方式

2. 前景色

代码及对应颜色如下:

  • 30:黑色。
  • 31:红色。
  • 32:绿色。
  • 33:黄色。
  • 34:蓝色。
  • 35:洋红。
  • 36:青色。
  • 37:白色。

在vscode的终端显示结果如下(注意37号白色被终端自动修改了以能够显示清楚):

前景色

而38号前景色是用于设置前景色的其他模式,包括两种:

  1. 使用 ANSI 256 色模式设置前景色,例如:\033[38;5;196m。这里的5表示使用 ANSI 256 色模式,196表示使用ANSI 256 色模式中的第 196 种颜色
  2. 使用 TrueColor 模式设置前景色,例如:\033[38;2;255;0;0m。这里的2表示使用 TrueColor 模式,255;0;0表示RGB颜色值

39号表示重置前景色为默认颜色。

3. 背景色

代码及对应颜色如下:

  • 40:黑色。
  • 41:红色。
  • 42:绿色。
  • 43:黄色。
  • 44:蓝色。
  • 45:洋红。
  • 46:青色。
  • 47:白色。

在vscode的终端显示结果如下(注意47号白色被终端自动修改了以能够显示清楚):

背景色

同样的,48号背景色是用于设置背景色的其他模式,包括使用 ANSI 256 色模式设置背景色和使用 TrueColor 模式设置背景色。
49号表示重置背景色为默认颜色。

4. 其他

还有一些其他比较有意思的转义代码,不过格式就不是\033[显示方式;前景色;背景色m了,如下:

  • \033[n*A :光标上移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:显示光标

参考资料

  1. Linux 命令行输出不同颜色的文本
  2. Adding colors to your motd?

Linux控制台输出多种样式彩色字符及原理解析
http://example.com/2024/03/02/colorfulEcho/
作者
滑滑蛋
发布于
2024年3月2日
许可协议