Der Befehl tput
hat zwei verschiedene Optionen für die Farbeinstellung, setf
und setaf
doch 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 setb
und zu geben setab
.
Was ist der Unterschied zwischen den beiden Optionen?
terminfo(5)
mitgelieferten Manpagencurses
.Antworten:
setf
ist auf nur 8 Farben begrenzt.setaf
kann 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
setf
undsetaf
geben einen anderen Escape-Code an. Sie können dies im Folgenden anzeigen:Von meiner
urxvt(7)
Manpage:Aus der obigen
xxd
Ausgabe können wir alsotput setf 2
ersehenPm = 32
, dass die verwendet wird , wodurch die Farbe auf Grün gesetzt wird.tput setaf 2
Zum anderen verwendet man diePm = 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 :
quelle
tput
scheint jedoch nicht die verfügbaren ANSI-Farbsequenzbereiche tatsächlich zu verwenden . Für jedenn > 7
,tput setaf n
hat keine Auswirkungen auf den Text in meinem Terminal.tput setf 2
undtput setaf 2
sind beide.[32m
.Aus dem Handbuch:
man 5 terminfo
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).
quelle
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:
setf/setb
.Sf/Sb
Codes anstelle vonsetaf/setab
(undAF/AB
für Termcap) verwendeten - aber die ANSI-Escape-Sequenzen (die mit Termcap funktionieren) verwendeten, anstatt die korrekten Funktionen mit den ANSI-Funktionen zu verwenden.Die ANSI
setaf/setab
wurden 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 BeispieleCaps.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/setb
Zeichenfolgen 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.quelle