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


17

コマンドは、tput色を設定するための2つの異なるオプションがあり、setfそしてsetaf、まだそれらの両方が自分のコンピュータ上でうまく動作するようです:

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

同様の二重性があるようですsetbsetab

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


1
詳細についてはterminfo(5)、付属のマニュアルページを参照しncursesてください。
ステファンシャゼル14年

回答:


15

setf8色のみに制限されています。setaf最大256色まで設定できます。

(これは私の端末であるため、以下の情報はすべて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出力から、を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

tputただし、実際に使用可能なANSIカラーシーケンス範囲を使用しているようには見えません。いずれの場合もn > 7tput setaf n端末のテキストには影響しません。
カイルストランド

実際、それは私の環境のちょっとした癖かもしれません。以下からの出力は私のためtput setf 2tput setaf 2されている両方 .[32m
カイルストランド

5

マニュアルから: man 5 terminfo

Tektronixタイプの端末で現在の前景色または背景色を変更するには、setaf(ANSI前景の設定)およびsetab(ANSI背景の設定)またはsetf(前景の設定)およびsetb(背景の設定)を使用します。これらは、色番号という1つのパラメーターを取ります。SVr4のドキュメントでは、setaf / setabのみが説明されています。XPG4ドラフトでは、 「端末がバックグラウンドとフォアグラウンドを設定するANSIエスケープシーケンスをサポートする場合、それぞれsetafsetabとしてコーディングする必要があります。端末がバックグラウンドとフォアグラウンドを設定する他のエスケープシーケンスをサポートする場合、setfおよびsetb、それぞれ。vidputs()関数と更新関数は、定義されている場合、setafsetabを使用します。」

したがって、答えは次のとおりです。setafANSIフォアグラウンドの設定、つまりANSIエスケープシーケンスの使用を意味し、setfフォアグラウンドの設定(ANSI以外のエスケープシーケンスの使用)を意味します。


3

2つの機能セットは、ANSIカラーのリストで赤/青の異なる順序を使用します。

前述のように、ncurses terminfoのマニュアルページで説明されています。いくつかの歴史:

  • 初期(1990年代半ば)では、ほとんどの利用可能な「カラー」端末記述が使用されていましたsetf/setb
  • termcap Sf/Sbではなくsetaf/setab(およびAF/ABtermcapに)対応するコードを使用したtermcapユーザーとの混乱がありましたが、ANSI機能で正しい機能を使用するのではなく、ANSIエスケープシーケンス(termcapで機能します)を使用しました。
  • そのため、mgterminterixbetermなどの2つの同等の端末エントリが見つかります(同様に、FreeBSDのtermcapファイルのいくつかのエントリも、この最初の混乱と、他のプログラムの修正に対する不本意によります)。

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

そのすべてを使用すると、既存の事実setf/setb一部につながっANSIの順序と一致しなかった文字列はすぐに気づいていなかった、1998年に修正し、よくある質問は、なぜ赤/青入れ替わっ?

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.