Que fait le commutateur grep --color = auto?

8

Quel effet autoune option pour le --colorcommutateur a-t-elle sur grep? Quand grep décide-t-il de colorer les chaînes correspondantes, et quand ne le fait-il pas?

Trolzen
la source

Réponses:

12

Comportement attendu

Avec --color=auto, grep mettra en évidence les chaînes correspondantes si (et seulement si) la sortie est écrite directement sur le terminal et ledit terminal est capable d'afficher une sortie colorée.

Normalement, --color=autoc'est ce que vous voulez. Si, par exemple, vous utilisez grep pour faire correspondre une URL et la redirigez vers Wget, Wget verra à la \e[1;31mhttp://...place de l'URL réelle (et s'étouffera dessus).

Les commandes suivantes devraient entraîner une sortie colorée:

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

Cependant, cette commande ne doit pas:

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

Toute incohérence avec ce comportement doit être considérée comme un bogue.

Code source

Avec --color=auto, la dernière version de Grep pour Windows (2.5.4) - ainsi que la version originale 2.5.4 sur laquelle elle est basée - coloriez la sortie si et seulement si la condition

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

est vrai, c'est-à-dire que si et seulement si la sortie est écrite sur un terminal, la variable d'environnementTERM est définie et le terminal n'est pas muet .

Cela ne produira pas le comportement souhaité sous Windows, car il TERMn'est normalement pas défini. Une solution simple à ce problème consiste à configurer le TERM=windowsdans le panneau de configuration.

La dernière version de grep (2.14) corrige ce problème en colorant la sortie si et seulement si la condition

isatty(STDOUT_FILENO) && should_colorize()

est vrai, où should_colorize()est défini différemment pour POSIX et Win32:

Pour les premiers, la condition est équivalente à celle de 2.5.4; pour ce dernier, la variable d'environnement TERMn'a pas besoin d'être définie (elle ne peut tout simplement pas l'être dumb).

Dennis
la source
Comment peut-il savoir s'il écrit sur le terminal ou non?
Trolzen
1
Il y a une fonction C pour ça. Si vous incluez le fichier d'en-tête sdgstd.h, istty(stdout)renvoie 0si la sortie est redirigée vers un fichier.
Dennis
J'expérimente avec les ports Windows de grepet lessdepuis le projet GnuWin (gnuwin32.sourceforge.net). cmd.exeest amélioré avec l' ansiconutilité. less --color=autofonctionne comme prévu: utilise la couleur lorsqu'aucune redirection n'est appliquée et pas lorsque la sortie est redirigée. Mais grep --color=auton'imprime pas les séquences d'échappement dans les deux cas.
Trolzen
Je ne comprends pas pourquoi cela se produit. Je pensais que ces utilitaires ont le même code dans les versions unix et windows et ils sont assez anciens. Ils devraient donc se comporter de manière identique.
Trolzen
C'est un bug dans le grep de GnuWin32 alors. Sur Ubuntu, il se comporte comme je l'ai détaillé dans ma réponse. Bien que les deux dérivent du même code source, il y a toujours des ajustements mineurs à faire si vous allez compiler sur une autre plate-forme. Gardez également à l'esprit que la version actuelle de grep de GnuWin32 est 2.5.4. La dernière version sur Ubuntu est la 2.12.
Dennis