Bunte Shells - Benutzung der Shellfarben

ArticleCategory: Hardware

SystemAdministration

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

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:

ansi colors

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 werden die Einstellungen f�r das Aussehen der Shell ver�ndert.

Normalerweise sollte dieser Eintrag folgende Form haben:
~/.bashrc: PS1="\s-\v\$ "
Wobei \s f�r den Namen 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: Sondersquenz) Sequenzen.Eine Escape Sequenz ist mindestens 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 den selben Effekt.

In der Shell kann man statt die Sequenz zu tippen, allerdings auch
Strg-V <ESC> dr�cken.

Farben der Shell benutzen

Die Farben der Shell werden zun�chst an einem Beispiel-Prompt erkl�rt.
~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
Dies stellt den kompletten Prompt in Gr�n dar. Etwa so:
nico@ebrain:~$

Dies stellt den kompletten Prompt in gr�n dar. \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, wird sp�ter erw�hnt. 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 diesem 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 an. Dies ist die Voreinstellung f�r die Shellfarbe. Sowohl f�r den Vordergrund als auch f�r den Hintergrund stehen 8 Farben zur Verf�gung.

Auswahl: schwarz, rot, gr�n, gelb, blau, magenta, cyan und wei�. Die Zahlen daf�r sind: 30, 31, 32, 33, 34, 35, 36, 37.

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:
nico@ ebrain: ~$

Am besten testet man diese Einstellungen per export PS1="string" in der Kommandozeile und kann die Einstellungen sp�ter in die bashrc eintragen. Der aktuelle Prompt des Autors 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\] "

[ nico@ebrain:~ ]

Eigenschaften der Schrift

Wie oben erw�hnt ist die 0 direkt nach der ersten Escape Sequenz die Voreinstellung f�r die Schrift des Shell-Promptes. F�r die Schrifteigenschaft sind die folgenden Werte sinnvoll: 0, 1, 22, 4, 24, 5, 25, 7, 27 und sie bedeuten: Standard, dick, nicht dick, unterstrichen, nicht unterstrichen, blinkend und nicht blinkend, invers, nicht invers.
Mit folgendem kleinen Shell Script kann man sich die Farbkombinationen ansehen.
#!/bin/sh
############################################################
# Nico Golde <[email protected]> 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 herunterladen: 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 Bin�rdatei beachtlich steigen lie�e. Ncurses hat allerdings den Vorteil, dass es mehr oder weniger unabh�ngig vom Terminal-Typ 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 den selben 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 l�sbar.

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 ver�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\]"
    ;;
Bei einigen Systemen kann es sein, dass \033 beim Starten des Systems nicht als Escape Sequenz interpretiert wird. An dieser Stelle muss man Strg-V <ESC> verwenden. M�chte man diese Einstellungen allerdings f�r alle init-Scripte vornehmen ist dies unter Umst�nden sehr zeitaufw�ndig.

Feedback

Feedback, Kritik, Bugs etc. bitte per Mail an "nico at ngolde.de" schicken. Viel Spa�...