ANSI 转义码

警告
本文最后更新于 2023-10-22,文中内容可能已过时。

ANSI 转义码

参考的官方文档:ANSI escape code - Wikipedia

ANSI 转义序列是带内信令(In-band signaling)的标准,用于控制视频文本终端和终端模拟器上的光标位置、颜色、字体样式和其他选项。某些字节序列 (大多数以 ASCII 转义字符和方括号字符开头) 被嵌入到文本中。终端将这些序列解释为命令,而不是逐字显示的文本。

带内信令(In-band signaling):就是在传递信号的同时传递控制信息,比如在传递语音或者视频的二进制数据的时候在内容数据的前面加上一段控制数据,在传递文本的时候在前面加上一段颜色设置。等等

ANSI 转义序列能做的事情很多,不过我们一般主要用它来设置终端中的文本的颜色

控制序列

控制序列主要用来控制光标的位置和页面的内容显示,对于控制序列或 CSI 命令,其组成为:ESC[(在几种编程和脚本语言比如 Bash 中写成\e[\033[) 后跟任意数量 (包括无) 的“参数字节”,参数字节的范围为 0x30 – 0x3F,(转换成 ASCII 的话对应0–9:;<=>?),然后跟着任意个“中间字节“,中间字节的范围为 0x20 – 0x2F (转换成 ASCII 的话对应!"#$%&'()*+,-./),最后为一个“最终字节“,最终字节的范围为 0x40 – 0x7E, (转换成 ASCII 的话对应@A–Z[\]^_`a–z{|}~)).

除了标准的控制序列外,还有一个标准孔子序列的子集,终端制造商可以在不与标准控制序列冲突的情况下在这个子集的范围内设置自己的序列。这个子集范围被称为私有控制序列,私有控制序列的特征是:参数字节为这几个 <=>? 或者最终字节在 0x70 – 0x7E (转换成 ASCII 的话对应``p–z{|}~`) 这个范围内。

以下是一些常用的 ANSI 控制序列,如果想要在 Bash 中使用这些命令,请把CSI替换成\e[\033[。同时注意不要有空格

Code Abbr Name Effect
CSI n A CUU Cursor Up 将光标向上移动 n 个单元格 (默认为’ 1 ‘)。如果光标已经在屏幕的边缘,则没有效果。例如在 Bash 中\e[nA
CSI n B CUD Cursor Down 将光标向下移动 n 个单元格 (默认为’ 1 ‘)。如果光标已经在屏幕的边缘,则没有效果。例如在 Bash 中\e[nB
CSI n C CUF Cursor Forward 将光标向右移动 n 个单元格 (默认为’ 1 ‘)。如果光标已经在屏幕的边缘,则没有效果。例如在 Bash 中\e[nC
CSI n D CUB Cursor Back 将光标向左移动 n 个单元格 (默认为’ 1 ‘)。如果光标已经在屏幕的边缘,则没有效果。例如在 Bash 中\e[nD
CSI n E CNL Cursor Next Line 将光标移动到从当前行往上的第 n 行 (默认为’ 1 ‘) 的开头。(not ANSI.SYS)。例如在 Bash 中\e[nE
CSI n F CPL Cursor Previous Line 将光标移动到从当前行往下的第 n 行 (默认为’ 1 ‘) 的开头。(not ANSI.SYS)。例如在 Bash 中\e[nF
CSI n G CHA Cursor Horizontal Absolute 将光标移动到第 n 列 (默认为’ 1 ‘)。 (not ANSI.SYS)。例如在 Bash 中\e[nG
CSI n ; m H CUP Cursor Position 将光标移动到第 n 行,第 m 列。值是从 1 开始的,如果 m 和 n 都省略,则都默认为 1,对应左上角。像CSI;5H实际上是CSI 1;5HCSI 17;H等价于CSI 17HCSI 17;1H。对应到 Bash 中\e[n;mH
CSI n J ED Erase in Display 清除部分屏幕。如果 n 为 0 (或缺失),则从光标到屏幕末尾清除。如果 n 为 1,则清除从光标到屏幕开头的内容。如果 n 为 2,则清空整个屏幕 (并在 DOS ANSI.SYS上将光标移至左上角)。如果 n 为 3,清空整个屏幕并删除 scrollback 缓冲区中保存的所有行(此功能是为xterm添加的,其他终端应用也支持)。例如在 Bash 中\e[2J
CSI n K EL Erase in Line 擦除行的一部分。如果 n 是 0 (或缺少),清除从游标到行尾的内容。如果 n 为 1,则从清除游标到行首的内容。如果 n 为 2,则清空整行。光标位置不会改变。例如在 Bash 中\e[2K
CSI n S SU Scroll Up 将整个页面向上滚动 n 行 (默认为 1 )。如果内容不够了,就在底部添加新行 (not ANSI.SYS)
CSI n T SD Scroll Down 将整个页面向下滚动 n 行 (默认为 1 )。如果内容不够了,就在顶部添加新行。(not ANSI.SYS)
CSI n ; m f HVP Horizontal Vertical Position Same as CUP, but counts as a format effector function (like CR or LF) rather than an editor function (like CUD or CNL). This can lead to different handling in certain terminal modes.[5]: Annex A,跟CSI n ; m H效果差不多
CSI n m SGR Select Graphic Rendition 设置此代码后面的字符的颜色和样式,下一个小节的重点
CSI 5i AUX Port On 启用辅助序列化端口,这个端口通常为本地串行打印机使用
CSI 4i AUX Port Off 关闭辅助序列化端口,这个端口通常为本地串行打印机使用
CSI 6n DSR Device Status Report 通过发送ESC[n;mR报告光标位置 (CPR),其中 n 为行,m 为列。

在 Bash 中进行控制

echo -e "\e[2J"在脚本中很好用,我们可以在运行脚本的时候,把前面的东西都清理掉,这样就能专心看脚本执行的结果

图形呈现

控制序列CSI n m被称为 Select Graphic Rendition (SGR),作用是设置显示属性,一个控制序列中可以设置多个属性,用分号隔开即可,每一个显示属性都会保持生效,直到有 SRG 命令重置这个属性,重置命令为CSI 0 m,可简写为CSI m,在 Bash 中,可写为\e[m

显示属性列表:

n Name Note
0 Reset or normal 重置所有属性
1 Bold or increased intensity 加粗和增加对比度,此属性在 MobaXterm 中无效
2 Faint, decreased intensity, or dim 去加粗和降低对比度,此属性在 MobaXterm 中无效
3 Italic 斜体,此属性在 MobaXterm 中无效
4 Underline 下划线,例如在 Bash 中:echo -e "\e[4mxiashuo.xyz"
5 Slow blink 慢闪烁,例如在 Bash 中:echo -e "\e[5mxiashuo.xyz"
6 Rapid blink 快速闪烁,此属性在 MobaXterm 中无效
7 Reverse video or invert 反色,即交换字体颜色和背景颜色,比如一般字体颜色是白色,背景颜色是黑色,那么设置此属性之后,字体颜色变成黑色,背景颜色变成白色,例如在 Bash 中:echo -e "\e[7mxiashuo.xyz"
8 Conceal or hide 隐藏,此属性在 MobaXterm 中无效
9 Crossed-outor strike 删除线,例如在 Bash 中:echo -e "\e[9mxiashuo.xyz"
10 Primary (default) font 恢复默认的字体设置,此属性在 MobaXterm 中无效
11–19 Alternative font 设置字体大小,此属性在 MobaXterm 中无效
20 Fraktur (Gothic) 设置哥特式的字体,此属性在 MobaXterm 中无效
21 Doubly underlined; or: not bold 双下划线,此属性在 MobaXterm 中依然表现为单个下划线echo -e "\e[21mxiashuo.xyz"
22 Normal intensity 正常的字重,此属性在 MobaXterm 中无效
23 Neither italic, nor blackletter 正常的字体,此属性在 MobaXterm 中无效
24 Not underlined 取消下划线,例如在 Bash 中:echo -e "\e[24mxiashuo.xyz"
25 Not blinking 取消闪烁,例如在 Bash 中:echo -e "\e[25mxiashuo.xyz"
26 Proportional spacing 等比例放大空格,此属性在 MobaXterm 中无效
27 Not reversed 不翻转,此属性在 MobaXterm 中无效
28 Reveal 不隐藏,此属性在 MobaXterm 中无效
29 Not crossed out 取消删除线,例如在 Bash 中:echo -e "\e[29mxiashuo.xyz"
30–37 Set foreground color 设置字体颜色为基本的 8 个颜色(3 位),例如在 Bash 中:echo -e "\e[32mxiashuo.xyz"
38 Set foreground color 设置字体颜色为 8 位的 256 个颜色,格式为5;n,例如在 Bash 中:echo -e "\e[38;5;178mxiashuo.xyz",或者设置字体颜色为 24 位(3 个 8 位数字)的 RGB 三原色,格式位2;r;g;b,例如在 Bash 中:echo -e "\e[38;2;255;165;0mxiashuo.xyz"
39 Default foreground color 设置字体颜色为默认颜色,默认为白色,例如在 Bash 中:echo -e "\e[39mxiashuo.xyz"
40–47 Set background color 设置背景颜色为基本的 8 个颜色(3 位),例如在 Bash 中:echo -e "\e[42mxiashuo.xyz"
48 Set background color 设置背景颜色为 8 位的 256 个颜色,格式为5;n,例如在 Bash 中:echo -e "\e[48;5;178mxiashuo.xyz",或者设置背景颜色为 24 位(3 个 8 位数字)的 RGB 三原色,格式位2;r;g;b,例如在 Bash 中:echo -e "\e[48;2;255;165;0mxiashuo.xyz"
49 Default background color 设置背景颜色为默认颜色,默认为黑色,例如在 Bash 中:echo -e "\e[49mxiashuo.xyz"
50 Disable proportional spacing 此属性在 MobaXterm 中无效
51 Framed 此属性在 MobaXterm 中无效
52 Encircled 此属性在 MobaXterm 中无效
53 Overlined 此属性在 MobaXterm 中无效
54 Neither framed nor encircled 此属性在 MobaXterm 中无效
55 Not overlined 此属性在 MobaXterm 中无效
58 Set underline color 此属性在 MobaXterm 中无效
59 Default underline color 此属性在 MobaXterm 中无效
60 Ideogram underline or right side line Rarely supported
61 Ideogram double underline, or double line on the right side
62 Ideogram overline or left side line
63 Ideogram double overline, or double line on the left side
64 Ideogram stress marking
65 No ideogram attributes Reset the effects of all of 6064
73 Superscript Implemented only in mintty[44]
74 Subscript
75 Neither superscript nor subscript
90–97 Set bright foreground color Not in standard; originally implemented by aixterm[29]

其中,我们最常使用的,就是 30 - 49 这一段编码,用来设置输出内容的字体颜色和背景颜色。

3 位颜色对照表,官方文档:ANSI escape code - Wikipedia

而且,你可以通过脚本for code in {30..37}; do echo -e "\e[${code}m $code: Test"; done在 shell 中快速输出所有的 8 个颜色

8 位颜色对照表,官方文档:ANSI escape code - Wikipedia

而且,你可以通过脚本for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done在 shell 中快速输出所有的 256 个颜色

24 位颜色对照表,官方文档:ANSI escape code - Wikipedia,RGB 选色卡:RGB 颜色对照表

一般情况下,8 位的颜色就够用了,如果想要更加精细的控制,那就得使用 RGB

在 Bash 中设置文字颜色

在这篇文章中,已经有了比较好的总结:bash - How to change the output color of echo in Linux - Stack Overflow,直接看即可。

值得注意的是,如果你只是想在当前命令输出的文本中设置一下属性,然后下次输出的时候依然采用默认的属性,那么你可以在输出语句的末尾将属性重置:echo -e '\e[32mxiashuo.xyz\e[m'.

0%