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

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

このコマンドtputには色setfとを設定する2つのオプションがありますが、setafどちらも私のコンピュータでうまく機能しているようです。

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

setbそして似たような二重性を持っているようですsetab

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

答え1

setf8つの色に制限されています。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 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背景設定)またはセテフ(前景設定)と設定値(背景設定)。カラー番号という1つのパラメータを使用します。 SVr4 ドキュメントでは、次の内容のみ説明します。セタフ/セットタブ; XPG4ドラフトは次のとおりです。 「ターミナルが背景とフォアグラウンド設定のためにANSIエスケープシーケンスをサポートしている場合は、次のようにエンコードする必要があります。セタフそしてセットタブ、それぞれ。端末が背景とフォアグラウンド設定のために異なるエスケープシーケンスをサポートしている場合は、次のようにエンコードする必要があります。セテフそして設定値、それぞれ。 vidputs() 関数とリフレッシュ関数の使用セタフそしてセットタブ定義されている場合。 」

答えは次のとおりです。セタフ方法ANSI展望設定つまり、ANSIエスケープシーケンスを使用し、セテフ方法前景設定(ANSI以外の一部のエスケープシーケンスを使用)

答え3

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

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

  • 初期(1990年代半ば)、ほとんど使用可能「カラー」使用された端末の説明ですsetf/setb
  • Sf/Sbtermcapユーザーは代わりにそのコードsetaf/setab(termcapも含むAF/AB)を使用しますが、次の代わりにANSIエスケープシーケンス(termcapで使用)を使用します。正しいANSI機能を備えた機能。
  • したがって、両方とも同じ端末項目を見つけることができます。例えば、mg用語索引ベデム(また、初期の混乱や他の人がプログラムの修正を消極的にしたので、FreeBSDのtermcapファイルにあるいくつかの項目も同様です。)

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

それにもかかわらず、setf/setb既存の文字列がANSI順序と一致しないという事実はすぐに認識されず、いくつかの問題が発生しました。1998年に復元とよくある質問なぜ赤/青に変わったのですか?

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

関連情報