ANSI-Escape-Sequenzen in Shellskripts
Inhalt
1. Einleitung
Die verbreiteten Terminal-Emulatoren wie xterm, rxvt, PuTTY oder die Standard-Emulatoren der
UNIX/Linux-Desktop-Umgebungen, unterstützen alle die Manipulation von Textfarbe und weiteren Eigenschaften wie
Fettschrift über Escape-Sequenzen. Dieser kleine Artikel zeigt Ihnen, wie Sie diese Möglichkeit in
Shellskripts nutzen können (etwa um Warnhinweise rot anzuzeigen oder blinken zu lassen).
2. Übersicht ANSI Codes
Dies ist eine Auswahl an ANSI-Escape-Sequenzen und weiterer Codes, die sich gut in Shell-Skripts machen:
::: Textfarben ::: Schwarz ESC[30m Rot ESC[31m Grün ESC[32m Gelb ESC[33m Blau ESC[34m Magenta ESC[35m Cyan ESC[36m Weiß ESC[37m Default ESC[39m ::: Hintergrundfarben ::: Schwarz ESC[40m Rot ESC[41m Grün ESC[42m Gelb ESC[43m Blau ESC[44m Magenta ESC[45m Cyan ESC[46m Weiß ESC[47m Default ESC[49m ::: Texteigenschaften ::: Fett (Farben unverändert)................ ESC[1m Text unterstreichen...................... ESC[4m Text blinken lassen...................... ESC[5m Alles auf Default zurücksetzen........... ESC[0m ::: Verschiedenes ::: Fenstertitel............................. ESC]0;${TITEL}BEL Terminal Bell............................ BEL Grafischer Zeichensatz................... ^N Normaler Zeichensatz..................... ^O ::: Beispiele ::: Fetter gelber Text auf rotem Hintergrund. ESC[1;33;41m Fetter unterstrichener Text.............. ESC[1;4m __________________________________________________________________ Legende: - ESC = ^[ = \033 - BEL = ^G = \007 - ^N = \016 - ^O = \017
Man kann mehrere Escape-Sequenzen zu einer kombinieren.
Beispiel: Wir möchten Fettschrift, gelbe Textfarbe und roten Hintergrund kombinieren.
ESC[1m
ESC[33m
ESC[41m
Kombiniert werden die drei Eigenschaften zu ESC[1;33;41m
- dieser Escape-Sequenz
werden wir im nächsten Absatz noch öfter begegnen.
3. Benutzung von ANSI-Codes in Shellskripts
mit »printf«
Die Codes aus der obigen Liste können auf allen UNIX-Systemen mit printf genutzt werden. Möchte man z.B. den Text "Fetter gelber Text auf rotem Hintergrund" fett gelb auf rotem Hintergrund erscheinen lassen, geht dies mit
$ printf "\033[1;33;41m
Fetter gelber Text auf rotem Hintergrund\033[0m
\n"
Natürlich lässt sich der hervorgehobene Text auch in eine Variable verpacken:
$ TEXT="Fetter gelber Text auf rotem Hintergrund" $ printf "\033[1;33;41m
%s\033[0m
\n" "$TEXT"
mit »echo«
Auf vielen Systemen funkionieren die ANSI-Escape-Sequenzen auch mit echo - abhängig allerdings von System- und Shelltyp:
$ echo -e "\033[1;33;41m
Fetter gelber Text auf rotem Hintergrund\033[0m
"
Man beachte die Option "-e". Nicht alle echo-Versionen unterstützen diesen Schalter. Sie geben statt dessen "-e" als Text mit aus.
mit anderen Kommandos
Es ist aber auch möglich die ANSI-Codes mit Kommandos zu benutzen, die ANSI-Escape-Sequenzen eigentlich nicht unterstützen. Dies funktioniert deshalb, da diese Sequenzen gar nicht vom Kommando selbst, sondern vom Terminal interpretiert werden. Man muss also nur dafür sorgen, dass die Codes ungefiltert zum Terminal gelangen. Dies erreicht man, indem man an Stelle von \033 das "ESCAPE-Zeichen" direkt verwendet. Im vi erreicht man dies zum Beispiel, indem man im Editiermodus Strg-V ESC eingibt. Es erscheint dann ^[. Bewegt man den Curser darüber, erkennt man, dass es sich aber nur um ein Zeichen handelt. Das gleiche gilt für das "BEL-Zeichen" (verantwortlich für das Piepen des Terminals): statt \007 verwendet man einfach Strg-G (im vi Strg-V Ctrl-G eingeben - es erscheint dann ^G).
Beispiele:
$ FETTTEXT="^[
[1;33;41m Fetter gelber Text auf rotem Hintergrund^[
[0m" $ echo "$FETTTEXT" $ $ TITEL="^[
]0; Ich bin ein Fenstertitel^G
" $ echo "$TITEL"