GästebuchIhr Eintrag in unser Gästebuch KontaktNehmen Sie Kontakt mit den Autoren auf ArchivAlle Unixwerk- Artikel seit 2003
18. Oktober 2012

ANSI-Escape-Sequenzen in Shellskripts

 

Inhalt

  1. Einleitung
  2. Übersicht ANSI Codes
  3. Benutzung von ANSI-Codes in Shellskripts

 

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.

  • Fettschrift ist ESC[1m
  • gelbe Textfarbe ist ESC[33m
  • roter Hintergrund ist 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"