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

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

Welchen Effekt hat autoeine Option für den --colorSchalter in grep? Wann entscheidet grep, die passenden Strings einzufärben, und wann nicht?

Antwort1

Erwartetes Verhalten

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

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

Die folgenden Befehle sollten eine farbige Ausgabe ergeben:

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 dieses Verhaltens sollte als Fehler betrachtet werden.

Quellcode

Mit --color=autodem neuestenGrep für WindowsVersion (2.5.4) – sowie die ursprüngliche Version 2.5.4, auf der sie basiert – färbt die Ausgabe genau dann ein, wenn die Bedingung

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

ist wahr, d. h. genau dann, wenn die Ausgabe auf ein Terminal geschrieben wird,UmgebungsvariableTERMist definiert und das Terminal ist nichtdumm.

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 die Einstellung TERM=windowsin der Systemsteuerung.

Die neueste Version vongrep(2.14) behebt dieses Problem, indem die Ausgabe genau dann eingefärbt wird, wenn die Bedingung

isatty(STDOUT_FILENO) && should_colorize()

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

TERMIm ersten Fall ist die Bedingung äquivalent zu der von 2.5.4, im zweiten Fall muss die Umgebungsvariable nicht gesetzt werden (sie kann es einfach nicht dumb).

verwandte Informationen