Was ist der Unterschied zwischen 'setf' und 'setaf' von tput?

17

Der Befehl tputhat zwei verschiedene Optionen für die Farbeinstellung, setfund setafdoch beide scheinen gut funktionieren auf meinem Computer:

$ 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?

IQAndreas
quelle
1
Weitere Informationen finden Sie auf der terminfo(5)mitgelieferten Manpage ncurses.
Stéphane Chazelas

Antworten:

15

setfist auf nur 8 Farben begrenzt. setafkann bis zu 256 Farben einstellen.

(Alle folgenden Informationen sind urxvt-spezifisch, da dies mein Terminal ist. Die Informationen sind jedoch ähnlich, wenn nicht gleich, wie bei anderen Terminals.)

Beides setfund setafgeben einen anderen Escape-Code an. Sie können dies im Folgenden anzeigen:

# 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 tput setf 2ersehen Pm = 32, dass die verwendet wird , wodurch die Farbe auf Grün gesetzt wird. tput setaf 2Zum anderen verwendet man die Pm = 38;5, die den in ISO 8613-6 definierten Farbcode darstellt (auch grün).
In ISO 8613-6 sind die Farben 0x00-0x07 die gleichen wie die Standardfarben und 0x08 - 0x0f sind die Standardfarben "fett". Sobald Sie 0x10-0xff erhalten, erhalten Sie neue Farben.

Aus Wikipedia gestohlen :

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
Patrick
quelle
tputscheint jedoch nicht die verfügbaren ANSI-Farbsequenzbereiche tatsächlich zu verwenden . Für jeden n > 7, tput setaf nhat keine Auswirkungen auf den Text in meinem Terminal.
Kyle Strand
Eigentlich könnte das nur eine Eigenart meiner Umgebung sein; für mich die Ausgänge aus tput setf 2und tput setaf 2sind beide .[32m .
Kyle Strand
5

Aus dem Handbuch: man 5 terminfo

Verwenden Sie setaf (ANSI-Vordergrund festlegen ) und setab (ANSI-Hintergrund festlegen ) oder setf (Vordergrund festlegen) und setb (Hintergrund festlegen), um die aktuelle Vordergrund- oder Hintergrundfarbe auf einem Terminal vom Typ Tektronix zu ändern . Diese nehmen einen Parameter, die Farbnummer. Die SVr4-Dokumentation beschreibt nur setaf / setab ; Der XPG4 - Entwurf besagt: "Wenn das Terminal ANSI - Escape - Sequenzen zum Festlegen von Hintergrund und Vordergrund unterstützt, sollten diese als setaf bzw. setab codiert werden . Wenn das Terminal andere Escape - Sequenzen zum Festlegen von Hintergrund und Vordergrund unterstützt, sollten sie als setf und codiert werden setb, beziehungsweise. Die Funktionen vidputs () und refresh verwenden setaf und setab, wenn sie definiert sind. "

Die Antwort lautet also: setaf bedeutet ANSI-Vordergrund setzen , dh ANSI-Escape-Sequenzen verwenden, und setf bedeutet Vordergrund setzen (mit einigen anderen Escape-Sequenzen als ANSI).

Will Sheppard
quelle
3

Für die beiden Funktionssätze wird in der Liste der ANSI-Farben eine unterschiedliche Reihenfolge für Rot / Blau verwendet.

Wie bereits erwähnt, wird dies auf der Hilfeseite zu ncurses terminfo erklärt . Einige Geschichten:

  • Zu Beginn (Mitte der 1990er Jahre) wurden die meisten verfügbaren "Farb" -Anschlussbeschreibungen verwendet 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) verwendeten, anstatt die korrekten Funktionen mit den ANSI-Funktionen zu verwenden.
  • Aus diesem Grund finden Sie Terminaleinträge mit den beiden gleichgestellten Einträgen, z. B. mgterm , interix , beterm (sowie mehrere Einträge in der Termcap-Datei von FreeBSD, wiederum aufgrund dieser anfänglichen Verwirrung und der Zurückhaltung anderer, ihre Programme zu ändern).

Die ANSI setaf/setabwurden relativ spät im Verlauf von terminfo hinzugefügt, da Sie aus ihrer Position in der Liste der Funktionszeichenfolgen schließen können . Denken Sie daran, dass diese in einigen Jahren schrittweise hinzugefügt wurden und sich einige Systeme unterschieden (ncurses enthält einige Beispiele Caps.hpux, damit sie so kompiliert werden können, dass sie mit diesen Systemen übereinstimmen). Dies war für die geringe Anzahl nützlicher Terminalbeschreibungen verantwortlich, die als Referenz verwendet werden konnten.

Bei alledem wurde die Tatsache, dass die vorhandenen setf/setbZeichenfolgen nicht der ANSI-Reihenfolge entsprachen, nicht sofort bemerkt, was 1998 zu einigen Korrekturen führte , und die FAQ Warum werden Rot / Blau vertauscht? .

Während es möglich war, die 8-Farben-ANSI-Sequenz auf 16 Farben zu erweitern (unter der Annahme, dass die Farben 8-15 hellere Versionen von 0-7 sind), gab es keinen guten Grund, ein Schema zu erfinden, das sich setf/setbüber die ersten 16 Farben hinaus erstreckt.

Thomas Dickey
quelle