Sie sind nicht angemeldet.

[Tipps & Tricks] Farben in der Shell

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

13.06.2007, 20:28

Farben in der Shell

Dieser Beitrag entstand aufgrund dieses Threads: less und Farbe

Es geht darum, warum manche CLI Anwendungen, wie bsp. emerge, eix, grep, colordiff..., mal ihre Daten bunt anzeigen und mal nicht. Was ist der Grund, wie geht es und wie kann man in einem Pager wie "less" es auch in Farbe bekommen.

Hier die wichtigsten Informationen:

Wie kommen überhaupt Farben ins Terminal?

Es werden ANSI color codes (http://pueblo.sourceforge.net/doc/manual…olor_codes.html) verwendet. Das sind Escape-Sequenzen, welche sich in dem auszugebenden Text "schmuggeln".

Beispiel:

Quellcode

1
$ printf '\033[47;31mHallo in rot mit weissen Hintergrund\033[0m und jetzt wieder normal\n'
Die Stellen mit \033[... sind die Escape-Sequenzen.

Technisch gesehen erfolgt einfach ein Zeichenstrom an das Terminal. Bevor nun das Terminal die Zeichen anzeigt guckt dieses nach, ob eine Steuerungssequenz (eingeleitet durch "Escape") die Ausgabe verändert... eben beispielsweise auf eine andere Farbe umstellt.

Warum haben einige Programme Farben im Output, andere nicht?

Jedes Programm muss für sich selbst in seinen eigenen Output diese "color codes" implementieren. Wenn die Entwickler das nicht getan haben, hat das Proggie keine Farben. Aus.

Allerdings gibt es Anwendungen, welche auf Basis von "regular expressions" einen Input von stdin nachträglich einfärben, bsp: der Generic Colouriser auf http://kassiopeia.juls.savba.sk/~garabik/software/grc.html.

Ich weiß, dass das Programm Farben hat, aber ich sehe das in meiner Ausgabe nicht!

Neben dem Programm muss auch der Terminal dazu in der Lage sein, diese Farben zu verarbeiten. Eine Liste von Terminals, welche Farben unterstützen gibt:

Quellcode

1
$ dircolors -p | grep TERM
Den aktuellen Terminal, vor dem man gerade sitzt gibt

Quellcode

1
$ echo ${TERM}
Taucht der eigene Terminal nicht in der Liste der color-fähigen Terminals auf, gibt es keine Farben, auch wenn das Progie prinzipiell Farben hätte.

Ok. Aber wenn ich die Ausgabe des Programms in eine Pipe ("|") oder in eine andere Datei (">") leite, dann sind die Farben weg!

Das ist eine Vorsichtsmaßnahme. Das Programm hat die Möglichkeit herauszufinden, ob es direkt in das Terminal schreibt oder in eine Pipe oder File. Allerdings: herauszufinden, welches Programm hinter der Pipe auf Eingaben lauert ist schon nicht mehr so einfach.

Um nun das folgende Programm nach der Pipe nicht zu "verwirren" wird die Farbecodierung abgeschaltet. Zur Erinnerung: die Farbcodes sind Escape-Sequenzen, welche zusätzlich (ohne echten Informationsgewinn) in den Ausgabestrom eingefügt werden.

Beispiel: es soll versucht werden "und und" aus obigen Beispiel zu finden. Das ist "... Hintergrund und jetzt wieder ...". Allerdings findet hier mitten drinnen ein Farbwechsel statt. Das bedeutet: nach dem ersten "und" wird durch zusätzliche, nicht sichtbare Zeichen die Darstellungsfarbe gewechselt.

Ein folgendes Programm wie "grep" kann jetzt scheitern:

Quellcode

1
2
3
$ printf '\033[47;31mHallo in rot mit weissen Hintergrund\033[0m und jetzt wieder normal\n' | grep "und und"
$ printf 'Hallo in rot mit weissen Hintergrund und jetzt wieder normal' | grep "und und"
Hallo in rot mit weissen Hintergrund und jetzt wieder normal
Die erste Zeile mit mit Farbcodierung läßt grep ins Leere laufen, da grep nicht über die Farbcodes hinweg kommt und das Pattern nicht matchen kann. Die zweite Zeile klappt, da hier kein Farbwechsel ist (alles einfärbig).

Ich will aber in der Pipe Farben haben!

Dazu müssen die Programmierer vorgesehen haben, einen bunten Output zu erzwingen. Auch dann, wenn in eine Pipe oder Datei geschrieben wird.

Das ist von Anwendung zu Anwendung natürlich verschieden. eix macht das mit "-F", emerge mit "--color y", ls mit "--color=always" ...

Wenn die Entwickler das nicht ermöglichen und im Bedarfsfall den Mechanismus deaktivieren, gibt es das nicht. Aus.

Ok. Jetzt hänge ich hinten less an, aber ich habe immer noch keine Farben!

Da muß man less noch mitteilen, das es die Farbcodes nicht herausfiltern soll, sondern mitanzeigt. Das geht über den Start-Parameter "-R". Da kann man einen alias dazu bauen, oder in die global "LESS" environment variable setzen (zu finden in /etc/env.d/70less).


Beispiele:

Quellcode

1
# emerge -puDN --color y world | less -R
zeigt in less bunt an was ein world update machen würde.

Quellcode

1
2
3
# emerge -puDN --color y world &> 2merge
# cat 2merge
# less -R 2merge
Das gleiche wie erstes Beispiel nur hier wird in eine Datei geschrieben. Der Inhalt der Datei ist bunt und kann auch so via "cat" in der Shell ausgegeben werden. less ist zwar der Meinung es könnte sich um binär File handeln (da Escapesequenzen) zeigt aber den Inhalt bunt an.

Quellcode

1
# eix -F apache | less -R
zeigt alle verfügbaren ebuilds mit "apache" im Namen an und es kann mit less bunt betrachtet werden.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

2

28.06.2007, 12:45

Von mir gegen gelesen.
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.