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

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

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\] "

[ nico@ebrain:~ ]

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 <[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 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�...