
Der Befehl tput
bietet zwei unterschiedliche Optionen zum Einstellen der Farbe, setf
und 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 setb
und zu geben setab
.
Was ist der Unterschied zwischen den beiden Optionen?
Antwort1
setf
ist auf nur 8 Farben beschränkt. setaf
Es 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 setf
bieten setaf
einen 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 xxd
Ausgabe können wir also ersehen, dass tput setf 2
verwendet wird Pm = 32
, wodurch die Farbe auf Grün gesetzt wird. tput setaf 2
verwendet 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/Sb
Codes anstelle vonsetaf/setab
(undAF/AB
fü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/setab
wurden 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.hpux
um 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/setb
Zeichenfolgen 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.