
コマンドには、tput
色を設定するための 2 つの異なるオプションと がありますsetf
がsetaf
、どちらも私のコンピューターでは問題なく動作するようです。
$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'
setb
およびにも同様の二重性があるようですsetab
。
2つのオプションの違いは何ですか?
答え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
ことがわかります。一方、 は を使用し、ISO 8613-6 で定義された色コード (これも緑) を表します。ISO 8613-6 では、色 0x00-0x07 は標準色と同じで、0x08 - 0x0f は標準の「太字」色です。0x10-0xff に到達すると、新しい色が得られます。tput setf 2
Pm = 32
tput setaf 2
Pm = 38;5
盗まれたウィキペディア:
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背景を設定)またはセット(フォアグラウンドに設定)およびセットb(背景を設定する)。これらは1つのパラメータ、色番号を取ります。SVr4のドキュメントでは、セタフ/セタブXPG4草案では、 「端末が背景と前景を設定するためのANSIエスケープシーケンスをサポートしている場合は、次のようにコード化する必要があります。セタフそしてセタブ端末が背景と前景を設定するための他のエスケープシーケンスをサポートしている場合は、次のようにコーディングする必要があります。セットそしてセットbvidputs()関数とrefresh関数はそれぞれセタフそしてセタブ定義されている場合。」
答えは次のようになります:セタフ手段ANSIフォアグラウンドを設定するつまり、ANSIエスケープシーケンスを使用し、セット手段前景を設定(ANSI 以外のエスケープ シーケンスを使用します)。
答え3
2 つの機能セットでは、ANSI カラーのリスト内の赤と青の順序が異なります。
前述のように、ncursesで説明されているterminfo マニュアルページ歴史の一部:
- 初期(1990年代半ば)には、最も入手しやすい"色"使用される端末の説明
setf/setb
。 - termcapユーザーの間では混乱が生じており
Sf/Sb
、 termcapsetaf/setab
ではAF/AB
ANSIエスケープシーケンスを使用する代わりに、正しいANSI 機能を備えた機能。 - そのため、2つが同一視されるターミナルエントリが見つかるでしょう。例えば、mgterm、インターリックス、ベターム(FreeBSD の termcap ファイルにもいくつかのエントリがありますが、これもまた、この初期の混乱と、他の人がプログラムを修正することに消極的だったことが原因です)。
ANSIはsetaf/setab
terminfoの歴史の中でかなり後期に追加されたものであることが、機能文字列のリストこれらは数年にわたって段階的に追加され、いくつかのシステムは異なっていたことに注意してください(ncursesには次のような例があります)。Caps.hpux
これらのシステムと一致するようにコンパイルできるようにするためです。そのため、参照に使用できる有用な端末記述が少数でした。
これらすべてにもかかわらず、既存の文字列がANSIの順序と一致していないという事実はsetf/setb
すぐには気づかれず、いくつかの1998年の修正、FAQなぜ赤と青が入れ替わるのでしょうか?。
8 色の ANSI シーケンスを 16 色に拡張することは可能でしたが (8 色から 15 色を 0 色から 7 色のより明るいバージョンと仮定することにより)、setf/setb
最初の 16 色を超えて拡張するスキームを発明する正当な理由はありませんでした。