解析在 bash shell 中设置颜色的文本

Parsing the text that sets colors in a bash shell

有人能给我指点一下网络上的一些文档,这些文档可以解释 bash shell 如何解析以下设置颜色的行,或者从解析器视图中解释以下内容将读取行?

但是第一个 \033 是做什么用的,32 和 33 之后的 'm' 是做什么用的?

green ="\[3[0;32m\]"
blue="\[3[0;34m\]" 

并最终将这些和其他项目导出到 PS1

开始阅读 bash 的最佳位置是 Bash Prompt HOWTO, specifically the section Bash Prompt Escape Sequences.

字符3(称为escescape)后跟左方括号[ 是 7 位字符构成 ECMA-48 控制序列启动器 (CSI) 的方式。 开始一个控制序列,一直持续到最终字符(必须在64-126范围内),在本例中是。最后一个字符是决定它是什么类型的控制序列的因素之一——这个是 SGR(设置图形再现)。

虽然大多数最终字符都是字母(A-Z 或 a-z),但也有一些不是。 XTerm Control Sequences 列出一些例如:

CSI Pm `  Character Position Absolute  [column] (default = [row,1])
          (HPA).
CSI Pt; Pl; Pb; Pr $ {
          Selective Erase Rectangular Area (DECSERA), VT400 and up.
            Pt; Pl; Pb; Pr denotes the rectangle.
CSI Ps ' |
          Request Locator Position (DECRQLP).
CSI Pm ' }
          Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.
CSI Pm ' ~
          Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.

以你为例

green ="\[3[0;32m\]"

拆解:

  • \[\] 告诉 bash 打折包含的字符(不要将它们算作具有宽度的可打印字符)。这是 bash 特有的。如果你使用 zsh,有一个 different way 可以做同样的事情。大多数 shell(例如 ksh)不提供此功能。
  • SGR 序列中的 0 重置 SGR 序列可能已设置的任何属性(例如颜色)。
  • ; 分号将它与下一个参数隔开,后者是一种特定的颜色。
  • ECMA-48 定义了 8 种前景色和 8 种背景色(通常被称为 "ANSI colors",虽然已经很久没有相应的 ANSI 标准了)。