Farbe in der Konsole

Aus Linupedia
Wechseln zu: Navigation, Suche

Farbe in der Konsole

Vorbemerkung 

hin und wieder möchte man auch auf einem Textterminal etwas Hervorheben oder farbig markieren. Das so etwas geht, hat wohl jeder schon einmal erlebt, nachdem man z.B. mc gestartet hat oder bei der Ausgabe von ls sich über die bunten Dateinamen gewundert hat.

  • Auf einem Textterminal ist eine farbige Anzeige mittels ANSI Escape Sequences möglich
  • Nicht alle Terminals unterstützen dies
  • Welchen Terminaltyp man derzeit benutzt, ist in der TERM-Umgebungsvariable hinterlegt. echo $TERM
  • Eine Übersicht, welche Typen farbige Ausgaben unterstützen findet man in der Datei /etc/DIR_COLORS (es ist aber nicht die authoritative Quelle)


Die ANSI Escape Sequence für Attribut- und Farbdarstellung

das Prinzip der Escape-Sequenzen für farbige Ausgabe

ist folgendes Format \033[, gefolgt von einer beliebigen Anzahl von Codes, die durch ; getrennt sind, und das letzte mit m abgeschlossen ist, z.B. \033[1;37;41m.

dabei gilt im Einzelnen

  • Eröffnung der Sequenz ist immer \033[ oder etwas abgekürzt \e[
  • Codes für die Hintergrundfarbe:
  • 40=schwarz
  • 41=rot
  • 42=grün
  • 43=braun
  • 44=blau
  • 45=violett ("magenta")
  • 46=cyan
  • 47=grau ("weiß")
  • 49=Standard
"Standard" bezieht sich auf die Voreinstellung des Terminals bzw. des Konsolenprogramms, und kann - insbesondere bei grafischen Terminalemulatoren - von allen (40 bis 47) in der Farbe abweichen.
  • Codes für Textattribute:
  • 0=alle Attribute und Farben zurücksetzen
  • 1=fett
  • 2=kursiv (wird oft nicht dargestellt oder durch eine Farbe ersetzt)
  • 4=unterstrichen
  • 5=blinken
  • 7=reverse
  • 22=fett ausschalten
  • 24=Unterstreichung ausschalten
  • 25=Blinken ausschalten
  • 27=reverse umkehren
  • Codes für die Vordergrundfarben
  • Wie bei Hintergrund, aber statt 40-47,49 jeweils 30-37,39
  • die einzelnen Codes werden mit Semikolon ohne zusätzliche Leerzeichen getrennt
  • den Abschluss bildet ein m


in Verbindung mit dem Attribut 0 oder 1 ergeben sich folgende Textfarben

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37


Beispiel für farbige Ausgaben

echo -e "\033[46;1;31m TESTAUSGABE \033[43;4;34m KUNTER \033[45;1;32m BUNT \033[44;1;33m ANGESTRICHEN \033[0m"

Am Ende sollte möglichst immer \033[0m anbinden, damit die nachfolgende Ausgabe dann wieder "normal" ist.


Script um eine Farbübersicht zu erhalten

Eine Übersicht welche Farben wie auf welcher Hintergrundfarbe wirkt, kann man mit diesem kleinem Script hier erzeugen [Fundort]

#!/bin/bash
#
#   This file echoes a bunch of color codes to the 
#   terminal to demonstrate what's available.  Each 
#   line is the color code of one forground color,
#   out of 17 (default + 16 escapes), followed by a 
#   test use of that color on all nine background 
#   colors (default + 8 escapes).
#

T='gYw'   # The test text

echo -e "\n                 40m     41m     42m     43m\
     44m     45m     46m     47m";

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \
           '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";
  done
  echo;
done
echo

der Befehl tput

Wie wir es gewohnt sind, gibt es unter LINUX immer mehrere Möglichkeiten um ein und das selbe zu erreichen. mit dem Befehl tput läßt sich ebenfalls Farbe auf die Konsole zaubern. Das ist aber nur ein Teilbereich dieses Befehls. Für genauere Informationen bitte in die Manpages von tput und terminfo schauen. Einen kleinen Vorgeschmack über die Möglichkeiten mittels tput die Farben innerhalb des Terminals zu beeinflussen bekommt man auch hier

Neben der Wahl von Textfarbe, Hintergrundfarbe, Textattribute wie Fett und Unterstrichen (um nur mal einige der Wichtigsten zu nennen), kann man mit tput auch den Cursor innerhalb des Terminals frei positionieren, einzelne Zeichen oder Zeilen löschen, oder neue Zeichen und Zeilen dazwischenschieben, den Bildschirm leer machen, oder das Terminal auf seine Einstellungen zurücksetzen, wenn man mal nur noch Sonderzeichen auf dem Bildschirm hat, die Eigenschaften des aktuellen Terminals abfragen und vieles mehr. Aber auch hier ist zu bemerken, dass die Möglichkeiten dieses Befehles schon durch die jeweiligen Terminaleinstellungen beschränkt werden. Man sollte also daran denken, wenn man innerhalb eines Scriptes mit tput arbeitet, dass es auf einem anderem Rechner oder den Einstellungen eines anderen Users durchaus auch ein furchtbares unansehnliches Bild ergeben kann. Auch sollte man unbedingt prüfen ob sich am Ende wirklich ein Terminal ( besser sogar noch welcher Terminaltyp ) befindet, oder die Ausgabe eventuell in eine Datei oder in eine Pipe geleitet ist. Anstelle von Erklärungen der einzelnen Funktionen und Optionen von tput hier ein kleines Script in dem einige Funktionen von tput eingebaut sind, zum Ausprobieren.

#!/bin/bash
if [ -t 1 ]
then
typeset -i ZEILE

tput clear
for HINTERGRUND in 0 1 2 3 4 5 6 7 8
do
  tput sgr0
  tput setaf $HINTERGRUND
  ZEILE=5+$HINTERGRUND

  for POSITION in 5 30 55
  do
    tput cup  $ZEILE $POSITION
    if [ $POSITION -eq 30 ]
     then tput smul
    fi
    if [ $POSITION -eq 55 ]
     then tput bold; tput rmul;
    fi

    for FARBE in 0 1 2 3 4 5 6 7 8
    do
      tput setab $FARBE
      echo -n "X-"
    done

  done

done
tput sgr0
tput home
for i in 1 2 3
do
 tput bel
 sleep 1
 tput flash
done

else
echo "Ausgabe geht nicht an ein Terminal"
fi

Anwendung von tput innerhalb eines Scriptes

oftmals wird man Farb- oder Testattribute öfter innerhalb eines Scriptes verwenden wollen. Es ist deshalb oftmals von Vorteil, wenn man diese Attribute in Variable ablegt, und dann an Ort und Stelle in die Ausgaben einbaut. Ein kleines Beispiel soll das verdeutlichen.

BLACK=`tput setaf 0`
ROT=`tput setaf 1`
BLAU=`tput setaf 4`
GELB=`tput setaf 3`

echo "Das hier ist ein Text der durch ${ROT}rote${BLACK} durch ${BLAU}blaue ${BLACK}" 
echo "und ${GELB}gelbe ${BLACK} Worte ${ROT}unterbrochen ${BLACK}ist."



Anwendung im Shell Prompt

farbiges Prompt

Die Shellvariable PS1 steuert das Verhalten des Prompts. Du kannst folgendes in deine .bashrc (in deinem Homeverzeichnis) schreiben:

if test \( "$TERM" = "xterm" -o "${TERM#screen}" != "$TERM" \) -a -z "$EMACS"
then
        export PS1="\[\033[31m\]\[\e]2;\u@\h:\w\007\e]1;\h\007\]\u@\h:\w> \[\033[0m\]"
else
        export PS1="\[\033[31m\]\u@\h:\w> \[\033[0m\]"
fi

Dann die Datei neu einlesen oder eine neue Bash eröffnen damit die Änderung wirkt
es genügt .bashrc im Homeverzeichnis abzusetzen

Danach solltest du einen roten Prompt haben.


Farbiger Errorlevel im Prompt

Errorlevel in rot anzeigen Folgenden Code in der aktuellen Bash ausführen oder für dauerhaften Gebrauch in der ~/.bashrc ablegen

PROMPT_COMMAND='LASTERROR="[$?]" ; test "$LASTERROR" = "[0]" || echo -ne "\033[93;41m${LASTERROR}\033[0m"'
export PROMPT_COMMAND 

Jetzt wird der Rückgabe Wert eines Befehles oder Scriptes insofern er nicht 0 ist, innerhalb des folgenden Prompt farbig angezeigt, das kann sehr hilfreich sein, z. B. für das Schreiben und Testen von Befehlsketten oder Scripte.

Links zum Thema Prompt

Anwendungen innerhalb des ls Befehles

Der ls Befehl kann Dateientypen an Dateiattributen und Prefixen erkennen und farbig darstellen.


Siehe dazu auch man ls
Verantwortlich für das Einschalten dieser Funktion ist die Option --color

Zuordnung der Farben zu den Dateitypen

Die Zuordnung der Farben zu den Dateitypen wird global für alle in der /etc/DIR_COLORS vorgenommen. Jedem User sollte es aber möglich sein diese Datei in sein Homeverzeichnis unter dem Namen .dir_colors zu kopieren, dann kann er seinen Bedürfnissen und Vorlieben entsprechend, selbst seine persönlichen Einstellungen durch ändern dieser Datei vornehmen.

cp /etc/DIR_COLORS ~/.dir_colors

Danach einfach die bash neu starten, damit die Änderungen wirken.

Mehr Infos mit man DIR_COLORS

Links zum Thema ls und Color


Syntax Highlighting im vi

Der Texteditor vi auf der Konsole, der in keinem LINUX/UNIX fehlt, ist in den modernen Linuxsystemen auf einen wesentlich leistungsfähigeren Nachfolger vim oder einen Klon davon, gelinkt. Dieser Editor kann unter Anderem auch Syntax Highlighting" für eine Vielzahl von Dateitypen.

Im Verzeichnis /usr/share/vim/current/syntax/ stehen die Syntaxkonfigurationsfiles. Anhand der Endung (prefix) der zu editierenden Datei erkennt vim welche Syntax für diesen Dateitype zu benutzen ist. Selbstverständlich kann man auch seine eigenen Syntax-Konfigurationsfiles entwerfen und einsetzen und auch die Farben anpassen. Siehe dazu http://vimdoc.sourceforge.net/htmldoc/usr_44.html


Ein- Ausschalten des Syntax highlighting im vim

permanent durch Eintrag in der Vim-Konfigurationsdatei ~/.vimrc 

anlegen der Datei bzw. erweitern dieser Datei und folgenden Eintrag vornehmen

syntax on
bei Bedarf durch Zeilenoption beim Start von vi 
# vi +"syn on" file.prefix
bei Bedarf während der Sitzung im Kommandomodus 

hier kann während der Sitzung dieser Modus nach Belieben Ein- und Ausgeschaltet werden

:syntax on

Analog Ausschalten

:syntax off