Bash

在這個 033[01;32m VT100 風格的 ANSI 轉義序列中,什麼是 01;還有他們?

  • May 26, 2020

這來自 ~/.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;and是m什麼?

ANSI 轉義碼\033[01;32m屬於哪一部分。

要閱讀的標準是 ECMA-35 和 ECMA-48。(“ANSI”在很大程度上是用詞不當。對於這種情況,“VT100 風格”也是如此。)這些解釋了控制序列有四個部分:

  1. 控制序列介紹器( CSI) 字元,在現代用語中是 U+009F,在這些 1970 年代標準的用語中是 9/15
  2. 零個或多個參數字元,取自 U+0030 到 U+003F 的範圍
  3. 零個或多個中間字元,取自 U+0020 到 U+002F 的範圍
  4. 一個最終字元,取自 U+0040 到 U+007E 的範圍

Control Sequence Introducer 位於所謂的C1 控製字元範圍內,其值從 U+0080 到 U+009F。

到 1980 年代中期,終端和串列通信的世界幾乎完全是 8 位乾淨的,這在很大程度上要歸功於來自個人電腦、BBS、Fidonet 等世界的選擇壓力。回到 1970 年代,當時安裝到 7 位仍然是一個重要的問題,ECMA-38 和 ECMA-45 為 C1 控製字元提供了一個替代的 7 位編碼系統,其值不適合 7 位。大約 40 年後,這仍然是石化的,在轉義字元 ( ) 中,隨後[是 CSI 的 7 位編碼。

您會發現所有 C1 範圍都有替代的 7 位編碼。你也會發現有很多人不知道這一點。有些軟體不能將實際的CSI 字元辨識為控制序列介紹器。有些軟體不能處理所有的 7 位編碼,只有一個用於控制序列引入器。另一方面,一些軟體已經趕上了 1980 年代中期,即使不是7 位編碼也能辨識實際的 C1 控製字元。

因此,分解您的特定控制順序,有:

  1. \033[— 編碼的編碼,CSI 字元的 7 位編碼進一步編碼為 C 風格的轉義序列,由 Bourne Again shell 處理
  2. 01;32— 五個參數字元
  3. 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 允許使用者使用 、 和類似 shell 變數中的百分比序列來編碼顏色和屬性更改,而不是直接使用 C 樣式的轉義來編碼特定的控制序列*。*Z shell 會在 terminfo 數據庫中查找相應的控制序列。因此 Z shell 中的類似提示字元串可能如下所示:PS1``RPROMPT

PS1=%B%F{綠色}%n@%m%f%b

或者,如果顏色 #10 並且沒有粗體是實際想要的:

PS1=%F{10}%n@%m%f

最後:這些不是“VT100 風格”。VT100 經常被​​人們泛泛而談。這是不正確的;這些是 ECMA-48 控制序列,而不是“VT100 風格”。對於初學者來說,一個重要的事實是,VT100是單色的,沒有多色功能。不要養成濫用“vt100”或“vt102”作為名稱的壞習慣。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/588600