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