Was macht der grep-Schalter --color = auto?

8

Welchen Effekt hat autoeine Option für den --colorSwitch in grep? Wann beschließt grep, die passenden Zeichenfolgen einzufärben, und wann nicht?

Trolzen
quelle

Antworten:

12

Erwartetes Verhalten

Mit --color=autogrep werden übereinstimmende Zeichenfolgen hervorgehoben, wenn (und nur wenn) die Ausgabe direkt in das Terminal geschrieben wird und das Terminal farbige Ausgaben anzeigen kann.

Normalerweise --color=autoist es das , was Sie wollen. Wenn Sie beispielsweise grep verwenden, um eine URL abzugleichen und an Wget weiterzuleiten, wird Wget \e[1;31mhttp://...anstelle der tatsächlichen URL angezeigt (und daran erstickt).

Die folgenden Befehle sollten zu einer farbigen Ausgabe führen:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

Dieser Befehl sollte jedoch nicht:

echo Super User | grep --color=auto Super | cat

Jede Inkonsistenz mit diesem Verhalten sollte als Fehler angesehen werden.

Quellcode

Mit --color=autoder neuesten Grep für Windows- Version (2.5.4) sowie der ursprünglichen Version 2.5.4, auf der es basiert, wird die Ausgabe genau dann eingefärbt, wenn die Bedingung erfüllt ist

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

ist wahr, dh genau dann, wenn die Ausgabe in ein Terminal geschrieben wird, wird die UmgebungsvariableTERM definiert und das Terminal ist nicht dumm .

Dies führt unter Windows nicht zum gewünschten Verhalten, da TERMes normalerweise nicht definiert ist. Eine einfache Lösung für dieses Problem ist das Einstellen des TERM=windowsBedienfelds.

Die neueste Version von grep (2.14) behebt dieses Problem, indem die Ausgabe genau dann eingefärbt wird, wenn die Bedingung erfüllt ist

isatty(STDOUT_FILENO) && should_colorize()

ist wahr, wo should_colorize()für POSIX und Win32 unterschiedlich definiert ist:

Für erstere entspricht die Bedingung der von 2.5.4; Für letztere muss die Umgebungsvariable TERMnicht gesetzt werden (kann es einfach nicht sein dumb).

Dennis
quelle
Wie findet es heraus, ob es in das Terminal schreibt oder nicht?
Trolzen
1
Dafür gibt es eine C-Funktion. Wenn Sie die Header-Datei einschließen sdgstd.h, wird istty(stdout)zurückgegeben, 0wenn die Ausgabe in eine Datei umgeleitet wird.
Dennis
Ich experimentiere mit Windows-Ports von grepund lessaus dem GnuWin-Projekt (gnuwin32.sourceforge.net). cmd.exewird mit dem ansiconDienstprogramm verbessert . less --color=autoFunktioniert wie erwartet: Verwendet Farbe, wenn keine Umleitung angewendet wird, und nicht, wenn die Ausgabe umgeleitet wird. Druckt grep --color=autoaber in beiden Fällen keine Escape-Sequenzen.
Trolzen
Ich kann nicht verstehen, warum das passiert. Ich dachte, diese Dienstprogramme haben sowohl in Unix- als auch in Windows-Versionen den gleichen Code und sind ziemlich alt. Sie sollten sich also identisch verhalten.
Trolzen
Das ist dann ein Fehler in GnuWin32s grep. Unter Ubuntu verhält es sich so, wie ich es in meiner Antwort beschrieben habe. Während beide vom selben Quellcode stammen, müssen immer geringfügige Anpassungen vorgenommen werden, wenn Sie auf einer anderen Plattform kompilieren möchten. Beachten Sie auch, dass GnuWin32s aktuelle Version von grep 2.5.4 ist. Die neueste Version unter Ubuntu ist 2.12.
Dennis