Sind die terminalen Farbfluchtsequenzen irgendwo für Bash definiert?


22

Ich habe alle so oft Farben in Bash Scripting (meist auf CentOS) verwendet, aber ihre Verwendung mehr convinient ich Ende zu bilden Neudefinition Variablen Farbwerte:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

oder auch mit tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Ich habe das /etc/rc.d/init.dVerzeichnis durchsucht , aber nichts gefunden, was mit Farbdefinitionen zu tun hat.

Gibt es eine solche Definition bereits? Wenn nicht, würde ich sie zum Beispiel in eine Datei /etc/rc.d/init.deinfügen und sie in meine Skripte aufnehmen lassen, ein bisschen wie bei/etc/rc.d/init.d/functions


Sie sind nicht, weil sie \e[1;30mzum Beispiel technisch nicht grau darstellen, sondern der Farbschlitz, der normalerweise von einem Terminal als grau angezeigt wird. Terminalemulatoren können die tatsächlichen Anzeigefarben frei ändern und sind häufig eine vom Benutzer konfigurierbare Option.
Chepner

Antworten:


36

In dem, was Sie fragen, spielen verschiedene Aspekte eine Rolle.

Erstens definiert bash keine Farben. Tatsächlich ahnt bash gar nicht, dass es überhaupt Farben gibt. Es weiß nur, dass Sie es angewiesen haben, die Zeichen auszugeben \033[0;36m. Ihr Terminal-Emulator (xterm, gnome-terminal, was auch immer) empfängt diese Zeichen und versteht "Ich muss mit der Ausgabe in Cyan beginnen".

Somit ist es Ihr Terminal-Emulator, der Farben versteht. Ihr Terminal-Emulator versteht, dass \033[0;36mes sich um Cyan handelt, aber ein anderer Terminal-Emulator verwendet möglicherweise einen völlig anderen Zeichensatz für Cyan (obwohl kein vernünftiger Terminal-Emulator den Standard zur Schau stellt und dies tut). Dies ist der Grund für tput. Wenn Sie ausführen tput setaf 6, werden tputdie Escape-Codes Ihres Terminals für die Farbe 6 (Cyan) nachgeschlagen und dieser Escape-Code ausgegeben.
( Weitere Informationen zu Codes finden Sie in dieser Frage.tput setaf )

Nun zurück zur Bash. Wie Sie vielleicht bemerkt haben, verwende ich, wenn ich mich auf die Farbe Cyan beziehe \033[0;36m, nicht \[\033[0;36m\]. Die eckigen Klammern fehlen. Der Zweck der eckigen Klammern ist, dass bash bei Verwendung von Escape-Codes (Farben) in der Eingabeaufforderung wissen muss, welche Zeichen nicht gedruckt werden (Breite Null, zeigt eigentlich nichts an). So schließen Sie nicht druckbare Zeichen in ein \[ \]. Wenn Sie diese Zeichen entfernen, scheint zunächst alles in Ordnung zu sein, aber wenn Ihr Befehl die Breite des Terminals überschreitet, werden Sie auf jede Art von Verrücktheit stoßen. Dies liegt daran, dass bash während der Eingabe wissen muss, wann der Befehl in die nächste Zeile umgebrochen werden soll. Dazu berechnet es die Breite der Eingabeaufforderung und anschließend die Breite der von Ihnen eingegebenen Zeichen.

Noch eine Notiz, ungefähr tput. CYAN="\[\033[0;36m\]"ist nicht dasselbe wie CYAN="$(tput setaf 6)". Wie wir gerade besprochen haben, sind die eckigen Klammern relevant für Bash und geben tputnur die Terminal-Escape-Codes aus.

Da eckige Klammern normalerweise nur in der Eingabeaufforderung relevant sind, sollten Sie sie nicht verwenden, wenn Sie Farben in der Ausgabe eines Skripts oder Ähnlichem verwenden. Das heißt, wenn Sie Farben für mehr als nur Eingabeaufforderungen verwenden möchten, müssen Sie mehrere Variablen definieren. Eine mit eckigen Klammern für die Verwendung in der Eingabeaufforderung und eine ohne für alles andere. Sie können die eckigen Klammern jedoch auch jedes Mal manuell hinzufügen, wenn Sie auf eine Farbe in der Eingabeaufforderung verweisen.

So lange die Rede ist, möchten Sie wahrscheinlich Folgendes definieren:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"

Wie sehe ich dann Farben, wenn ich mich mit Ctrl++ bei einem realen Terminal Altanmelde F1?
Serge Stroobandt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.