这来自 ~/.bashrc
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
注意\033[01;32m
我知道\033[
是控制序列介绍者。我知道32
绿色的颜色代码。
但是, 和 是01;
什么m
?
哪一部分ANSI 转义码确实\033[01;32m
属于。
答案1
要阅读的标准是 ECMA-35 和 ECMA-48。 (“ANSI”在很大程度上是一个误称。对于这种情况,“VT100 风格”也是如此。)这些解释了控制序列有四个部分:
- A控制序列引入器(CSI) 字符,现代用语中为 U+009F,而 1970 年代标准中的用语为 9/15
- 零个或多个参数字符,取自 U+0030 至 U+003F 范围
- 零个或多个中间字符,取自 U+0020 到 U+002F 范围
- 一个单一的最终角色,取自 U+0040 到 U+007E 范围
控制序列引入器处于所谓的范围内C1控制字符,其值从 U+0080 到 U+009F。
到 20 世纪 80 年代中期,终端和串行通信的世界几乎完全是 8 位干净的,这在很大程度上要归功于来自个人计算机、BBS、Fidonet 等世界的选择压力。早在 1970 年代,当拟合时7 位仍然是一个重要问题,ECMA-38 和 ECMA-45 为 C1 控制字符提供了替代 7 位编码系统,其值不适合 7 位。大约 40 年后,这一点仍然僵化在转义字符 ( ␛
) 中,随后[
成为 CSI 的 7 位编码。
您会发现所有 C1 范围都有替代的 7 位编码。你还会发现,有很多人不知道这一点。有些软件不识别实际的CSI 角色作为控制序列介绍者。有些软件并不处理所有 7 位编码,仅处理控制序列引入器的编码。另一方面,有一些软件已经赶上 20 世纪 80 年代中期并识别实际的 C1 控制字符即使没有7 位编码。
因此,分解你的特定控制序列,有:
\033[
— 编码的编码,CSI 字符的 7 位编码进一步编码作为由 Bourne Again shell 处理的 C 风格转义序列01;32
— 五个参数字符m
——最终角色
中间字符(可能没有)和最终字符的组合指定了控制序列的功能。这样的函数有很多,包括为供应商扩展保留的一整套函数。 (由于控制序列的上述结构,甚至可以在流中处理/跳过未知的供应商扩展。)在这种情况下表示的是设置图形呈现(SGR),标准控制序列之一。
参数字符以 10 为基数编码一串以分号分隔的数字参数。 (实际上,参数字符串可以包含更多内容。冒号是合法的参数字符,毕竟它的值为 U+003A。根据后来的 ITU 标准,它被用来表示子参数。这实际上也适用于SGR。类似地,DEC VT 使用参数字符 U+003F,?
作为标准控制序列上某些 DEC 变体的扩展标记。)在 SGR 的情况下,这些参数表示要为打印输出设置的颜色和属性(即“再现”) “图形”字符)。
这些有很多,在这种特殊情况下,它们意味着:
01
— 黑体字32
— 绿色前景
这里有一个完整的题外话,关于 IBM PC 上的 CGA 显示系统以及使用 IBM PC 兼容机作为终端如何导致粗体等字体粗细变成颜色变化,幸运的是,这种惯例已逐渐消失。粗体字实际上意味着再次粗体字(正如它在 CGA 之前的时代的含义一样)。根据此约定,因此在一些(但幸运的是越来越少)终端仿真器上,此 SGR 序列将有效地将颜色 #10(亮绿色)设置为前景。
许多年前,AIXterm 终端仿真器引入了 SGR 90 到 97 和 100 到 107,用于将颜色 9 到 15 设置为前景色和背景色。 16 色惯例现在不仅很普遍,我们甚至还制定了256调色板惯例相当长一段时间了。获得前景色 #10 的更可靠方法是使用 SGR 92,不是SGR 1;32。
请注意,这对于一般 shell 提示来说并不是必需的。例如:Z shell 允许用户使用 C 风格的转义来编码颜色和属性更改,而不是直接编码特定的控制序列百分比序列在PS1
、RPROMPT
、 和类似的 shell 变量中用于各种提示。 Z shell 会在 terminfo 数据库中查找相应的控制序列。因此 Z shell 中的类似提示字符串可能如下所示:
PS1=%B%F{绿色}%n@%m%f%b或者,如果颜色#10并且没有粗体是实际想要的:
PS1=%F{10}%n@%m%f
最后:这些是不是“VT100风格”。人们常常将 VT100 作为一种概括。这是一个错误的;这些是 ECMA-48 控制序列,而不是“VT100 风格”。对于初学者来说,一个重要的事实是 VT100是单色的并且不具备多色功能。不要养成滥用“vt100”或“vt102”作为其名称的坏习惯。
进一步阅读
- 字符代码结构和扩展技术 。 ECMA-35。第 6 版。 1994。ECMA 国际。
- 编码字符集的控制函数。 ECMA-48。第 5 版。 1991。ECMA 国际。
- https://unix.stackexchange.com/a/197291/5132
答案2
根据研究我发现:
\033[01;32m
— 的部分ANSI 转义码属于哪个\033[01;32m
称为选择图形再现 (SGI) 终端输出序列(其中有代码CSI n m
。)\033[
— 是一个控制序列引入器01
— 是“大胆或增加强度”的代码。;
— 是一个分隔符代码。我们可以有尽可能多的代码就如我们所愿。有一张桌子供那些人使用代码维基百科页面上的 sANSI 转义码在选择图形再现 (SGR) 参数。32
是前景绿色文本的代码。m
将整个序列标记为CSI n m
SGI 序列。