コマンドtput
には、色を設定するための2つの異なるオプションsetf
とsetaf
がありますが、どちらも私のコンピューターでは問題なく動作するようです。
$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'
setb
とsetab
にも同様の双対性があるようです。
2つのオプションの違いは何ですか?
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)
manページから:
_ "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に到達すると、新しい色が得られます。
盗まれた wikipedia :
_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
_
マニュアルから: man 5 terminfo
Tektronixタイプの端末で現在の前景色または背景色を変更するには、setaf(ANSIフォアグラウンドを設定)およびを使用します。 setab(ANSI背景を設定)またはsetf(前景を設定)およびsetb (背景を設定)。これらは、カラー番号という1つのパラメーターを取ります。 SVr4のドキュメントでは、setaf/setab;についてのみ説明しています。 XPG4ドラフトではと表示されています。「端末がANSIエスケープシーケンスをサポートしてバックグラウンドとフォアグラウンドを設定する場合は、setafおよびsetabそれぞれ、端末がバックグラウンドとフォアグラウンドを設定するために他のエスケープシーケンスをサポートしている場合は、としてコーディングする必要があります。 setfとsetb、それぞれvidputs()関数と更新関数はsetafおよびsetab定義されている場合。 "
だから答えは:setafはANSIフォアグラウンドを設定するつまりANSIエスケープシーケンスを使用し、setfは、Set Foregroundを意味します(ANSI以外のエスケープシーケンスを使用します)。
2つの機能セットは、ANSIカラーのリストで赤と青の順序が異なります。
すでに述べたように、それはncurses terminfoマニュアルページ で説明されています。いくつかの歴史:
setf/setb
を使用しました。Sf/Sb
(およびtermcapの場合はsetaf/setab
)ではなく、対応するAF/AB
コードを使用したtermcapユーザーとの混乱がありました。 ANSI機能を備えた正しい機能。ANSI setaf/setab
は、 機能文字列のリスト での位置から推測できるため、terminfoの歴史のかなり後の方に追加されました。これらは数年かけて段階的に追加され、一部のシステムは異なっていたことに注意してください(ncursesには Caps.hpux
などの例があり、それらのシステムに一致するようにコンパイルできます)。これは、参照に使用できる少数の有用な端末記述の説明です。
以上のことから、既存のsetf/setb
文字列がANSI順序と一致しないという事実はすぐには気付かず、一部の 1998年の修正 、およびよくある質問 赤と青が入れ替わっていますか? 。
8色のANSIシーケンスを16色に拡張することは可能でしたが(色8〜15が0〜7の明るいバージョンであると仮定した場合)、setf/setb
過去を拡張するスキームを発明する正当な理由はありませんでした。最初の16色。