Bunte Shells - Benutzung der Shellfarben
ArticleCategory: Hardware
SystemAdministration
AuthorImage:[Here we need a little image from you]
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 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:
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:
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\] "
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�...