Was ist der Unterschied zwischen ‚setf‘ und ‚setaf‘ von tput?

Was ist der Unterschied zwischen ‚setf‘ und ‚setaf‘ von tput?

Der Befehl tputbietet zwei unterschiedliche Optionen zum Einstellen der Farbe, setfund setaf, doch beide scheinen auf meinem Computer problemlos zu funktionieren:

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

Es scheint eine ähnliche Dualität mit setbund zu geben setab.

Was ist der Unterschied zwischen den beiden Optionen?

Antwort1

setfist auf nur 8 Farben beschränkt. setafEs können bis zu 256 Farben eingestellt werden.

(alle folgenden Informationen beziehen sich speziell auf urxvt, da dies mein Terminal ist, aber die Informationen sind ähnlich, wenn nicht sogar identisch mit denen anderer Terminals)

Beide setfbieten setafeinen unterschiedlichen Escape-Code. Diesen können Sie im Folgenden einsehen:

# tput setf 2 | xxd  
0000000: 1b5b 3332 6d                             .[32m

# tput setaf 2 | xxd 
0000000: 1b5b 3338 3b35 3b32 6d                   .[38;5;2m

Von meiner urxvt(7)Manpage:

   "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)

Aus der obigen xxdAusgabe können wir also ersehen, dass tput setf 2verwendet wird Pm = 32, wodurch die Farbe auf Grün gesetzt wird. tput setaf 2verwendet andererseits das Pm = 38;5, das den in ISO 8613-6 definierten Farbcode darstellt (ebenfalls grün).
In ISO 8613-6 sind die Farben 0x00-0x07 dieselben wie die Standardfarben und 0x08 - 0x0f sind die standardmäßigen „fetten“ Farben. Sobald Sie 0x10-0xff erreichen, erhalten Sie neue Farben.

Gestohlen vonWikipedia:

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

Antwort2

Aus dem Handbuch:man 5 terminfo

Um die aktuelle Vordergrund- oder Hintergrundfarbe auf einem Tektronix-Terminal zu ändern, verwenden Siesetaf(ANSI-Vordergrund setzen) undeingestellt(ANSI-Hintergrund festlegen) odersetf(Vordergrund setzen) undsetb(Hintergrund festlegen). Diese nehmen einen Parameter an, die Farbnummer. Die SVr4-Dokumentation beschreibt nursetaf/eingestellt; der XPG4-Entwurf besagt, dass "Wenn das Terminal ANSI-Escape-Sequenzen zum Festlegen von Hintergrund und Vordergrund unterstützt, sollten diese wie folgt codiert werden:setafUndeingestellt. Wenn das Terminal andere Escape-Sequenzen zum Festlegen von Hintergrund und Vordergrund unterstützt, sollten diese wie folgt codiert werden:setfUndsetb. Die Funktion vidputs() und die Refresh-Funktionen verwendensetafUndeingestelltwenn sie definiert sind."

Die Antwort lautet also:setafbedeutetANSI-Vordergrund festlegen, d. h. verwenden Sie ANSI-Escape-Sequenzen undsetfbedeutetVordergrund festlegen(unter Verwendung einiger anderer Escape-Sequenzen als ANSI).

Antwort3

Die beiden Fähigkeitssätze verwenden eine unterschiedliche Reihenfolge für Rot/Blau in der Liste der ANSI-Farben.

Wie erwähnt, wird es in den ncurses erklärtTerminfo-Handbuchseite. Einige Geschichten:

  • Anfangs (Mitte der 1990er Jahre) waren die meisten verfügbaren"Farbe"verwendete Klemmenbeschreibungen setf/setb.
  • Es gab einige Verwirrung bei Termcap-Benutzern, die die entsprechenden Sf/SbCodes anstelle von setaf/setab(und AF/ABfür Termcap) verwendeten – aber die ANSI-Escape-Sequenzen (die mit Termcap funktionieren) anstelle derrichtigFähigkeiten mit den ANSI-Fähigkeiten.
  • Aus diesem Grund finden Sie Terminaleinträge mit den beiden gleichgesetzten Werten, z. B.mgterm,Interix,beterm(ebenso wie mehrere Einträge in der Termcap-Datei von FreeBSD, wiederum aufgrund dieser anfänglichen Verwirrung in Kombination mit der Zurückhaltung anderer, ihre Programme zu ändern).

Die ANSI setaf/setabwurden erst relativ spät in der Geschichte von terminfo hinzugefügt, wie man an ihrer Position in derListe der Fähigkeitszeichenfolgen. Bedenken Sie, dass diese schrittweise über mehrere Jahre hinweg hinzugefügt wurden und einige Systeme unterschiedlich waren (ncurses hat einige Beispiele wieCaps.hpuxum es so kompilieren zu lassen, dass es zu diesen Systemen passt). Das erklärt die geringe Anzahl nützlicher Terminalbeschreibungen, die als Referenz verwendet werden konnten.

Bei alledem fiel die Tatsache, dass die vorhandenen setf/setbZeichenfolgen nicht der ANSI-Reihenfolge entsprachen, nicht sofort auf, was zu einigenKorrekturen im Jahr 1998und die FAQWarum sind Rot/Blau vertauscht?.

Obwohl es möglich war, die 8-Farben-ANSI-Sequenz auf 16 Farben zu erweitern (indem man annahm, dass die Farben 8-15 hellere Versionen von 0-7 wären), gab es keinen guten Grund, ein Schema zu erfinden, das setf/setbüber die ersten 16 Farben hinausging.

verwandte Informationen