tput の「setf」と「setaf」の違いは何ですか?

tput の「setf」と「setaf」の違いは何ですか?

コマンドには、tput色を設定するための 2 つの異なるオプションと がありますsetfsetaf、どちらも私のコンピューターでは問題なく動作するようです。

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

setbおよびにも同様の二重性があるようですsetab

2つのオプションの違いは何ですか?

答え1

setf8色までに制限されています。最大setaf256色まで設定できます。

(以下の情報はすべて私の端末である urxvt に固有のものですが、他の端末と情報は同様、または同じです)

と は両方とsetfsetaf異なるエスケープ コードを提供します。これは次のように確認できます。

# 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 2Pm = 32tput setaf 2Pm = 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/ABANSIエスケープシーケンスを使用する代わりに、正しいANSI 機能を備えた機能。
  • そのため、2つが同一視されるターミナルエントリが見つかるでしょう。例えば、mgtermインターリックスベターム(FreeBSD の termcap ファイルにもいくつかのエントリがありますが、これもまた、この初期の混乱と、他の人がプログラムを修正することに消極的だったことが原因です)。

ANSIはsetaf/setabterminfoの歴史の中でかなり後期に追加されたものであることが、機能文字列のリストこれらは数年にわたって段階的に追加され、いくつかのシステムは異なっていたことに注意してください(ncursesには次のような例があります)。Caps.hpuxこれらのシステムと一致するようにコンパイルできるようにするためです。そのため、参照に使用できる有用な端末記述が少数でした。

これらすべてにもかかわらず、既存の文字列がANSIの順序と一致していないという事実はsetf/setbすぐには気づかれず、いくつかの1998年の修正、FAQなぜ赤と青が入れ替わるのでしょうか?

8 色の ANSI シーケンスを 16 色に拡張することは可能でしたが (8 色から 15 色を 0 色から 7 色のより明るいバージョンと仮定することにより)、setf/setb最初の 16 色を超えて拡張するスキームを発明する正当な理由はありませんでした。

関連情報