ANSI 转义码
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;5H,CSI 17;H 等价于 CSI 17H 和 CSI 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|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-out, or 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 60–64 |
| 73 | Superscript | Implemented only in mintty[44|44] |
| 74 | Subscript | |
| 75 | Neither superscript nor subscript | |
| 90–97 | Set bright foreground color | Not in standard; originally implemented by aixterm[29|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'.