Farben im Linux-Terminal

Datum

Auf einem Textterminal ist eine farbige Anzeige mittels ANSI Escape Sequences möglich, allerdings unterstützen dies nicht alle Terminals.
Wer speziell etwas mehr zu den ANSI Escape Sequences erfahren möchte, findet weitere Informationen dazu auf Wikipedia.

Damit ist es sowohl möglich seinen Shell-Prompt farbig zu gestalten, als auch Textausgaben bei z.B. der Ausführung von Shellscripten.
Ein Beispiel:

Grundlagen

Um nun einen String farbig darzustellen beginnt der entsprechende Bereich mit einer Escape-Sequenz.
In der bash ist das \e oder auch \033 gefolgt von einer beliebigen Anzahl von Codes, die durch ;(ohne weiteres Leerzeichen) getrennt sind und das letzte mit m abgeschlossen ist, z.B. \033[1;37;41m.
Um die Sequenz dann zu beenden und anschließend wieder die voreingestellten Farben zu verwenden, wird an das Ende des farbigen Strings die Escape-Sequenz \033[0m angehangen.
Bei den Codes müssen nicht immer alle Attribute (Schriftfarbe, Hintergrundfarbe, etc.) angegeben werden. Es reicht wenn die Codes verwendet werden, welche von den Voreinstellungen des Terminals abweichen.
Um den String Hello World in grüner Schrift in der Shell auszugeben verwendet man:
echo -e "\033[32mHello World\033[0m"
Hierbei wurde z.B. keine Hintergrundfarbe und auch kein Code für Textattribute mit angegeben.
Das mag komplex anmuten, aber so lassen sich gut 256 Farben im Terminal darstellen.

Grundlegender Aufbau:
<Escape-Sequenz><Code für Textattribute><Farbcode für Schriftfarbe><Farbcode für Hintergrundfarbe><m><STRING><Escape-Sequenz>

Codes für die Hintergrundfarbe:

  • 40=schwarz
  • 41=rot
  • 42=grün
  • 43=braun
  • 44=blau
  • 45=violett („magenta“)
  • 46=cyan
  • 47=grau („weiß“)
  • 49=Voreinstellung des Terminals

Codes für Textattribute:

  • 0=alle Attribute und Farben zurücksetzen
  • 1=fett
  • 2=kursiv (wird oft nicht dargestellt oder durch eine Farbe ersetzt)
  • 4=unterstrichen
  • 5=blinken
  • 7=reverse
  • 22=fett ausschalten
  • 24=Unterstreichung ausschalten
  • 25=Blinken ausschalten
  • 27=reverse umkehren

Codes für die Vordergrundfarben

  • Wie bei Hintergrund, aber statt 40-47,49 jeweils 30-37,39

in Verbindung mit dem Attribut 0 oder 1 ergeben sich folgende Textfarben

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

ANMERKUNG: Für die Ausgabe von 256 Farben sorgen die Attribute 38 bzw. 48.
Bsp.: echo -e "\033[48;5;201mHello World\033[0m"
Hierbei wird nun der String Hello World mit lila Hintergrund ausgeben.

Farben im Terminal ausgeben

Um sich alle Farben mit den entsprechenden Farbcode ausgeben zu lassen, kann man folgenden one-liner verwenden:
for COLOR in $(seq 1 254); do echo -e "\033[38;5;${COLOR}m${COLOR}\033[0m"; done;

Eine kompaktere Übersicht findet man im folgenden Shellscript, welches von folgender Seite stammt: www.tldp.org

#!/bin/bash
#
#   This file echoes a bunch of color codes to the 
#   terminal to demonstrate what's available.  Each 
#   line is the color code of one forground color,
#   out of 17 (default + 16 escapes), followed by a 
#   test use of that color on all nine background 
#   colors (default + 8 escapes).
#

T='gYw'   # The test text

echo -e "\n                 40m     41m     42m     43m\
     44m     45m     46m     47m";

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \
           '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";
  done
  echo;
done
echo

Die Ausgabe sieht dann in etwa wie folgt aus:

Verwendung in bash-scripten

In bash-scripten lassen sich so per Variablen (Sub)strings farbig machen.

RED="\033[1;31m"
BLUE="\033[1;34m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
MAGENTA="\033[1;35m"
NONE="\033[0m"

NONE ist hierbei die End-Escape-Sequenz, nach der anschließend wieder der Systemstandard verwendet wird.

Ein kleines Beispiel:

#!/bin/bash
RED="\033[1;31m"
GREEN="\033[1;32m"
NONE="\033[0m"
echo -e "$GREEN Hello $RED World!$NONE"

ergibt:

Autor
Kategorien Linux, Scripting

PRTG Map