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

3076
Trolzen

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

8

1 Antwort auf die Frage

12
Dennis

Erwartetes Verhalten

Mit --color=autowird hervorgehobene 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 verschluckt).

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 betrachtet werden.

Quellcode

Mit --color=autoder neuesten Version von Grep für Windows (2.5.4) - sowie dem Original 2.5.4, auf dem sie basiert - färben Sie die Ausgabe, wenn und nur dann, wenn die Bedingung vorliegt

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

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

Dies führt nicht zu dem gewünschten Verhalten unter Windows, da TERMes normalerweise nicht definiert ist. Eine einfache Lösung für dieses Problem ist die Einstellung TERM=windowsin der Systemsteuerung.

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

isatty(STDOUT_FILENO) && should_colorize() 

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

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

Wie findet es heraus, ob es auf das Terminal schreibt oder nicht? Trolzen vor 11 Jahren 0
Dafür gibt es eine C-Funktion. Wenn Sie die Header-Datei `sdgstd.h` einschließen, gibt` istty (stdout) `0 zurück, wenn die Ausgabe in eine Datei umgeleitet wird. Dennis vor 11 Jahren 1
Ich experimentiere mit Windows-Ports von "grep" und "less" aus dem GnuWin-Projekt (gnuwin32.sourceforge.net). `cmd.exe` wurde mit dem` ansicon`-Dienstprogramm verbessert. "less --color = auto" funktioniert wie erwartet: Verwendet Farbe, wenn keine Umleitung angewendet wird, und nicht, wenn die Ausgabe umgeleitet wird. `Grep --color = auto` druckt jedoch in beiden Fällen keine Escape-Sequenzen. Trolzen vor 11 Jahren 0
Ich kann nicht verstehen, warum das so ist. 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 vor 11 Jahren 0
Das ist ein Fehler in GnuWin32s grep. Unter Ubuntu verhält es sich wie in meiner Antwort beschrieben. Beide stammen zwar aus demselben Quellcode, es müssen jedoch immer geringfügige Anpassungen vorgenommen werden, wenn Sie auf einer anderen Plattform kompilieren. Denken Sie auch daran, dass die aktuelle Version von GnuWin32 für grep 2.5.4 ist. Die neueste Version von Ubuntu ist 2.12. Dennis vor 11 Jahren 0
Ich habe Quellen für grep-2.14, coreutils-8.20, diffutils-3.2, gawk-4.0.1 von http://ftp.gnu.org/gnu/ heruntergeladen und weder `sdgstd` noch` istty` gefunden ( Es gibt wenige Vorkommen von 'istty' in gawk, aber das sind keine Funktionsaufrufe, sondern Variablennamen. Trolzen vor 11 Jahren 0
Unter Windows sollten Sie _isatty (_fileno (stdout)) `verwenden können. Sie müssen entweder "io.h" oder "unistd.h" angeben. Dennis vor 11 Jahren 0
Ich glaube ich war nicht klar. Ich habe Quellen für _linux_-Versionen heruntergeladen. Und in diesen _linux_-Quellen gibt es keine Zeichenfolgen wie "isatty". Trolzen vor 11 Jahren 0
Ah, ich dachte, Sie wollten die Windows-Version reparieren ... Es muss nicht "isatty" sein; das war nur ein beispiel. `isatty (fileno (stdout))` würde auch funktionieren, und es gibt wahrscheinlich ein paar andere Möglichkeiten. Dennis vor 11 Jahren 0
Eigentlich ja, ich möchte die Windows-Version reparieren. Ich möchte also verstehen, warum es einen Unterschied zwischen den Versionen gibt und wie Programme feststellen, ob sie auf das Terminal schreiben oder nicht. Gibt es neben `istty ()` und `_isatty ()` noch weitere Funktionen? Trolzen vor 11 Jahren 0
Es ist in "main.c", Zeile "2185": `if (color_option == 2) color_option = isatty (STDOUT_FILENO) && should_colorize ();` Dennis vor 11 Jahren 0
Ich habe es endlich herausgefunden. "grep" ruft nicht nur "isatty ()" auf, sondern prüft die Umgebungsvariable "TERM" (im Gegensatz zu "ls"). Wenn es undefiniert ist (unter Windows normalerweise), verwendet `grep` keine Farben. Unter Linux gibt es auch einige Situationen, in denen TERM nicht definiert ist. Trolzen vor 11 Jahren 0
Antwort bearbeitet Ein paar Anmerkungen: 1) Es gibt keine Funktion "istty", möglicherweise Druckfehler. 2) Ich weiß nicht, warum ich oben "weniger" geschrieben habe. Ich meinte "ls" :-). @dennis danke für die Hilfe! Trolzen vor 11 Jahren 0
Könnten Sie diese Änderung bitte zur Antwort hinzufügen? http://superuser.com/review/suggested-edits/50586 Trolzen vor 11 Jahren 0
Ich habe meine Antwort so bearbeitet, dass sie die von Ihnen erwähnten Informationen enthält. Die `istty`-Funktion existiert zwar, ist aber Teil von [Thinkage GCOS] (http://www.thinkage.ca/english/gcos/index.shtml), nicht die Standardbibliotheken. Dennis vor 11 Jahren 0