Bunte Shells -- Benutzung der Shellfarben
    ArticleCategory: Hardware
    SystemAdministration 
    AuthorImage:[Here we need a little image from you]
    ![[Photo of the Author]](../../common/images2/NicoGolde.jpg) 
 
    TranslationInfo:[Author + translation history. mailto: or
    http://homepage]
    original in de Nico
    Golde
    AboutTheAuthor:[A small biography about the author]
    Nico ist zur Zeit noch Schüler, beschäftigt sich seit
    einigen Jahren intensiv mit Linux und gehört zu mehreren Open
    Source Projekten.
    Abstract:
    In einem zum ANSI Terminal standard kompatiblen Terminal (wie
    xterm, rxvt, konsole, ...) kann man Text nicht nur in
    schwarz/weiß darstellen. Dieser Artikel zeigt, wie man Text in
    Fettdruck oder Farbe erhält. 
    ArticleIllustration:
     
 
    ArticleBody:
    Allgemeines
    Mit der Bash kommt praktisch jeder Linux-Benutzer irgendwann in
    Berührung. Auf den ersten Blick sieht diese sehr langweilig
    aus, doch man hat viele Möglichkeiten, seine Shell individuell
    zu gestalten. Farbliche Hervorhebungen des Shell-Promptes
    machen die Shell zum einen individuell und zum anderen gut
    lesbar. 
    
    In diesem Dokument werde ich mich auf die Shell bash beziehen.
    Die Escape Sequenzen können sich von Terminal zu Terminal
    unterscheiden, ich benutze für diesen Text ein ANSI Terminal. 
    Konfiguration der Shell
    Bei der Bash ist die zentrale Konfigurationsdatei, die auch bei
    der Konfiguration der Shellfarbe zum Einsatz kommt, die Datei
    ~/.bashrc oder die globale bash Konfigurationsdatei /etc/bashrc.
    Mittels der PS1 Variable in der bashrc wird das Aussehen 
des Prompts bestimmt.
    
    
    Normalerweise sollte dieser Eintrag folgende Form haben: 
~/.bashrc: PS1="\s-\v\$ "
    wobei \s für den Name der Shell und -\v für die Version steht.
    Am Ende des Promptes wird dann ein $ gesetzt. Da dies ein wenig
    langweilig ist, kann man stattdessen folgenden Eintrag
    verwenden, den die meisten Linux-Distributionen als
    Standardeinstellung haben: 
~/.bashrc: PS1="\u@\h \w \$ "
    Dies steht für user@host aktuelles_verzeichnis $. Dies ist der
    normale Shell-Prompt, den die meisten Linux-Benutzer gewöhnt
    sein werden. 
    Escape Sequenzen
    Um diesem Prompt mittels verschiedener Farben eine persönliche
    Note zu verleihen, verwendet man nun Escape (engl: flüchten, hier aber: Sondersequenz)
    Sequenzen. Eine Escape Sequenz ist ein Steuerzeichen, das die
    Shell veranlasst, etwas Bestimmtes auszuführen. Eine Escape
    Sequenz wird normalerweise mittels ^[ eingeleitet. Diese
    Schreibweise ist etwas gewöhnungsbedüftig, \033 hat denselben
    Effekt. 
    
    Um direkt in der Shell eine Escape Sequenz zu tippen, muss man
    crtl-v vorstellen. Also tippt man folgendes:
     CTRL-v ESC  
    Farben der Shell benutzen
    Ich erkläre die Farben der Shell zunächst an einem
    Beispiel-Prompt. 
~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
    Dies stellt den kompletten Prompt in grün dar.
Etwa so:
 \033 leitet die
    Escape Sequenz ein, [ eröffnet die Farbangabe. Die
    anschließende 0 gibt an, dass eine Normaldarstellung benutzt
    wird. Welche anderen Möglichkeiten man an dieser Stelle hat,
    erwähne ich später. Der ganze String ist in \[ und \]
    eingeschlossen, damit die Escape- Sequenzen nicht in die
    Ausgabe mit reinkommen und Platz auf der Shell wegnehmen. 
    
     Als nächstes wird die Vordergrundfarbe gewählt (in dem Fall
    32, entspricht grün). Die Hintergrundfarbe 40 steht für die
    Farbe Schwarz. Möchte man in unserem Beispiel nicht, dass die
    Schrift nach dem Prompt auch grün ist, so fügt man an den
    Schluss die Escape Sequenz \033[0m ein. Dies ist die default
    Einstellung für die Shellfarbe. Sowohl für den Vordergrund als
    auch für den Hintergrund stehen 8 Farben zur Verfügung. 
    
    Auswahl: rot, grün, gelb, blau, magenta, cyan und weiß. Die
    Zahlen dafür sind: 30, 31, 32, 33, 34, 35, 36, 37 und stehen
    für: schwarz, rot, grün, gelb, blau, magenta, cyan und weiß.
    
    
    Das Setzen der Hintergrundfarbe verläuft genauso, allerdings
    statt 3 mit 4. Also 40, 41, 42, 43, 44, 45, 46, 47. 
    
    Beispiel: 
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
Das ergibt einen sehr bunten Prompt:
    Am besten testet man diese Einstellungen per export
    PS1="string". Später kann man die Einstellungen in die bashrc
    eintragen. Mein aktueller Prompt sieht z.B. so aus: 
PS1="\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] "
    Eigenschaften der Schrift
    Wie oben erwähnt, ist die 0 direkt nach der ersten Escape
    Sequenz die default Farbeinstellung für die Schrift des
    Shell-Promptes. Für die Schrifteigenschaft machen folgende
    Werte einen Sinn: 0, 1, 22, 4, 24, 5, 25, 7, 27 und sie
    bedeuten: default, dick, nicht dick, unterstrichen, nicht
    unterstrichen, blinkend und nicht blinkend, invers, nicht
    invers. 
    
     Mit folgendem kleinen Shellskript kann man sich die
    Farbkombinationen angucken. 
#!/bin/sh
############################################################
# Nico Golde <nico@ngolde.de> Homepage: http://www.ngolde.de
# Letzte Änderung: Mon Feb 16 16:24:41 CET 2004
############################################################
for attr in 0 1 4 5 7 ; do
    echo "----------------------------------------------------------------"
    printf "ESC[%s;Foreground;Background - \n" $attr
    for fore in 30 31 32 33 34 35 36 37; do
        for back in 40 41 42 43 44 45 46 47; do
            printf '\033[%s;%s;%sm %02s;%02s  ' $attr $fore $back $fore $back
        done
    printf '\n'
    done
    printf '\033[0m'
done
    Das Script gibt es auch hier als tar.gz zum herrunterladen: showansicol.tar.gz 
    Eine andere Form der Anwendung
    Die Fähigkeit der Farbsetzung in der Shell macht nicht nur
    Sinn, wenn man einen schöneren Shell-Prompt haben möchte,
    sondern kann auch in der Programmierung eines Programmes für
    die Konsole sinnvoll sein. 
    
    So müsste man bei jeder Benutzung von Farben auf Bibliotheken
    wie slang oder ncurses zurückgreifen, was die Größe der binary
    Datei beträchtlich steigen ließe. Ncurses hat allerdings den
    Vorteil, dass es mehr oder weniger Terminal-Typ unabhängig ist.
    
    Beispiele in C
    Ein Hello World mit grüner Schrift: 
#include <stdio.h>
int main(void){
  const char *const green = "\033[0;40;32m";
  const char *const normal = "\033[0m";
  printf("%sHello World%s\n", green, normal);
  return 0;
}
    Eine weitere nützliche Escape Sequenz ist printf("\033[2J");
    Sie hat denselben Effekt wie system(clear); allerdings kann
    man damit auf die Headerdatei unistd.h verzichten. 
    
     Mit printf("\033[1K"); lässt sich eine Zeile löschen. 
    Beispiel für die init-Scripte
    Möchte man nicht, dass beim Starten der init-Scripte in
    /etc/init.d nur ein '.' beim erfolgreichen Starten des
    Prozesses angezeigt wird, sondern statt dessen eine farbliche,
    besser lesbare Ausgabe, so ist dies auch mittels einer Escape
    Sequenz zu lösen. 
    
    Hier ein Auszug aus einem Cron init-Script: 
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
 case "$1" in
 start)  echo -n "Starting periodic command scheduler: cron"
     start-stop-daemon --start --quiet --exec /usr/sbin/cron
                 echo "."
;;
    Beim erfolgreichen Starten von Cron wird dann ein Punkt
    ausgegeben. Farblich könnte man das auch durch [Ok] gestalten,
    indem man den echo String ändert. Z.B. so: 
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start)  echo -n "Starting periodic command scheduler: cron"
        start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "\[ \033[1;34;40m[ \033[1;32;40mOk \033[1;34;40m]\033[0m\]"
    ;;
    Möchte man diese Einstellungen allerdings für alle init-Scripte
    vornehmen, ist das sehr zeitaufwendig, es sei denn, man benutzt
    als Escape Sequenz \033, da Strg-v <ESC> nicht als
    Zeichen interpretiert wird. 
    Feedback
    Feedback, Kritik, Bugs etc. bitte per Mail an "nico at
    ngolde.de" schicken. Viel Spaß...