tput 的「setf」和「setaf」有什麼不同?

tput 的「setf」和「setaf」有什麼不同?

該命令tput有兩個不同的選項用於設定顏色setfsetaf,但它們在我的計算機上似乎都工作得很好:

$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'

setb和似乎也有類似的二元性setab

這兩個選項有什麼區別?

答案1

setf僅限8種顏色。setaf最多可設定256種顏色。

(以下所有資訊將特定於 urxvt,因為這是我的終端,但這些資訊將與其他終端類似(如果不相同))

setf和都setaf提供不同的轉義碼。您可以在以下內容中查看:

# tput setf 2 | xxd  
0000000: 1b5b 3332 6d                             .[32m

# tput setaf 2 | xxd 
0000000: 1b5b 3338 3b35 3b32 6d                   .[38;5;2m

從我的urxvt(7)手冊頁:

   "ESC [ Pm m"
       Character Attributes (SGR)
       ...
       Pm = 30 / 40       fg/bg Black
       Pm = 31 / 41       fg/bg Red
       Pm = 32 / 42       fg/bg Green
       Pm = 33 / 43       fg/bg Yellow
       Pm = 34 / 44       fg/bg Blue
       Pm = 35 / 45       fg/bg Magenta
       Pm = 36 / 46       fg/bg Cyan
       Pm = 37 / 47       fg/bg White
       Pm = 38;5 / 48;5   set fg/bg to colour #m (ISO 8613-6)

因此,從上面的xxd輸出中,我們可以看到tput setf 2使用Pm = 32,它將顏色設為綠色。tput setaf 2另一方面使用Pm = 38;5,它代表 ISO 8613-6 中定義的顏色代碼(也是綠色)。
在 ISO 8613-6 中,顏色 0x00-0x07 與標準顏色相同,0x08 - 0x0f 是標準「粗體」顏色。一旦到達 0x10-0xff,您就會獲得新的顏色。

被盜自維基百科:

0x00-0x07:  standard colors (as in ESC [ 30..37 m)
0x08-0x0f:  high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7:  6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff:  grayscale from black to white in 24 steps

答案2

從手冊中:man 5 terminfo

若要變更 Tektronix 類型終端上的目前前景色或背景色,請使用塞塔夫(設定 ANSI 前景)和塞塔布(設定 ANSI 背景)或賽特夫(設定前景)和設定值(設定背景)。它們採用一個參數,即顏色編號。 SVr4文檔僅描述塞塔夫/塞塔布; XPG4 草案說 「如果終端支援 ANSI 轉義序列來設定背景和前景,則應將它們編碼為塞塔夫塞塔布, 分別。如果終端支援其他轉義序列來設定背景和前景,則應將它們編碼為賽特夫設定值, 分別。 vidputs() 函數和刷新函數使用塞塔夫塞塔布如果它們被定義的話。

所以答案是:塞塔夫方法設定 ANSI 前景,即使用 ANSI 轉義序列,且賽特夫方法設定前景(使用 ANSI 以外的一些轉義序列)。

答案3

兩組功能在 ANSI 顏色清單中使用不同的紅色/藍色順序。

如前所述,ncurses 中對此進行了解釋terminfo 手冊頁。一些歷史:

  • 早期(20 世紀 90 年代中期),最可用“顏色”使用的終端描述setf/setb
  • termcap 使用者使用對應的Sf/Sb程式碼而不是setaf/setab(以及AF/ABtermcap),但使用 ANSI 轉義序列(與 termcap 一起使用)而不是使用正確的具有 ANSI 功能的功能。
  • 因此,您會發現兩者相等的終端條目,例如,毫克術語,因特克斯,貝特姆(以及 FreeBSD 的 termcap 檔案中的幾個條目,同樣是由於最初的混亂以及其他人不願意修改他們的程式)。

ANSIsetaf/setab在 terminfo 的歷史中添加得相當晚,您可以從它們在 terminfo 中的位置推斷出能力字串列表。請記住,這些是在幾年內分階段添加的,並且某些系統有所不同(ncurses 有一些示例,例如Caps.hpux讓它被編譯以匹配這些系統)。這說明可供參考的有用終端描述數量很少。

儘管如此,現有setf/setb字串與 ANSI 順序不符的事實並沒有立即被注意到,這導致了一些問題1998年修復,以及常見問題解答為什麼紅/藍互換?

雖然可以將 8 色 ANSI 序列擴展到 16 色(假設顏色 8-15 是 0-7 的更亮版本),但沒有充分的理由發明一種方案來擴展setf/setb到前 16 種顏色。

相關內容