Wohin gehen meine ANSI-Escape-Codes, wenn ich zu einem anderen Prozess übergebe? Kann ich sie behalten?

36

Ich möchte manchmal die farbcodierte Ausgabe für einen Prozess leiten, z. grep ... aber wenn ich es zu einem anderen Prozess leite, zB. sed, die Farbcodes gehen verloren ...

Ist die eine Möglichkeit, diese Codes intakt zu halten?

Hier ist ein Beispiel, das die Farbausgabe verliert:

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
quelle
4
PS .. als allgemeine Info .. Ich habe gerade entdeckt, dass lesskolorierte Texteingaben akzeptiert werden können (nett :) ... zB: tree -C ~/ |less -Roderls -lR --color=always . |less -R
Peter.O

Antworten:

40

Viele Programme, die eine farbige Ausgabe generieren, erkennen, ob sie in ein TTY schreiben, und schalten Farben aus, wenn sie dies nicht tun. Dies liegt daran, dass Farbcodes ärgerlich sind, wenn Sie nur den Text erfassen möchten, und daher automatisch versuchen, "das Richtige zu tun".

Die einfachste Möglichkeit, die Farbausgabe eines solchen Programms zu erfassen, besteht darin, es anzuweisen, Farbe zu schreiben, obwohl es nicht mit einem TTY verbunden ist. Sie müssen die Dokumentation des Programms lesen, um herauszufinden, ob diese Option verfügbar ist. (Hat zB grepdie --color=alwaysOption.)

Sie können das expectSkript auch verwenden unbuffer, um eine Pseudotty wie die folgende zu erstellen:

echo barney | unbuffer grep barney | sed -n 1,$\ p
cjm
quelle
2
Vielen Dank für die Informationen zur TTY-Erkennung und zum Unbuffer-Fake-Out!
Shellter
@cjm .. Es funktioniert hier nicht (auf Ubuntu 10.04 / bash 4.1.5) ... aber mein 10.04-Repo hat nur eine -dev-Version und nichts in den Backports ... Es ist ein bisschen spät hier, also werde ich schauen morgen wieder ... aber wie du schon gesagt hast, werden diese Kolorierungsprogramme wahrscheinlich entsprechend dem Ausgabeziel umgeschaltet (mhhh, aber woher wissen sie, dass es keine Rolle spielt) es .. danke
,,,
@fred, in der Regel verwenden sie Isatty , um herauszufinden, wohin stdoutes geht. Ich bin mir nicht sicher, ob es unbufferfunktioniert, wenn Sie sowohl in das Programm als auch aus dem Programm heraus pfeifen. Ich habe es hier nicht installiert, um es zu versuchen.
cjm
Danke für die unbufferInformation, es hilft der Ausgabe meines IRC-Bots wie der Ausgabe in der Shell.
LiuYan 刘 研
4

Für mich geht das ;-! (in der aktuellen MingW-Umgebung)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney wird als roter Text angezeigt

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
Shellter
quelle
@shellter ... ja, dieses spezielle grep-Beispiel funktioniert auch für mich. Diese Option war mir nicht bekannt, bis Sie die Antwort gepostet haben. Vielen Dank dafür. Ich frage mich immer noch, ob es einen allgemeinen Weg gibt, dies zu tun ... zB tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Vielleicht (?) Gibt es einen Weg, eine Pipe dazu zu bringen, zu denken, dass sie an ein TTY ausgegeben wird ... oder eine solche allgemeine Problemumgehung. .
Peter.O
Ich habe gerade geprüft man tree... Es hat auch eine ähnliche Option, -C... vielleicht ist es eine gemeinsame Funktion für Programme, die Farb-Escape-Codes ausgeben ..
Peter.O