Welchen Effekt hat auto
eine Option für den --color
Schalter in grep? Wann entscheidet grep, die passenden Strings einzufärben, und wann nicht?
Antwort1
Erwartetes Verhalten
Mit --color=auto
hebt 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=auto
ist 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=auto
dem 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,UmgebungsvariableTERM
ist definiert und das Terminal ist nichtdumm.
Dies führt unter Windows nicht zum gewünschten Verhalten, da TERM
es normalerweise nicht definiert ist. Eine einfache Lösung für dieses Problem ist die Einstellung TERM=windows
in 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:
TERM
Im 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
).