Je veux une sortie colorée de grep
.
.... Mais
- Stratégie 1: GREP_OPTIONS. Mais c'est obsolète. Voir http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- Stragegy 2: GREP_COLORS ressemble à première vue à une solution, mais cela fait quelque chose de différent.
- Stratégie 3: alias. Cela ne fonctionne pas
find ... | xargs grep
, car xargs n'évalue pas les alias. - Stratégie 4: Écrivez un script wrapper simple. Non, je pense que c'est trop sale et fait plus de problèmes qu'il n'en résout.
- Stratégie 5: patcher le code source
- Stratégie 6: Contactez les développeurs grep, demandez un remplacement de GREP_OPTIONS
- Stratégie NICE-and-EASY: ... cela manque. Je n'ai aucune idée.
Comment résoudre ça?
Merci d'avoir essayé d'aider!
... mais je ne peux pas donner la prime
Appelez-moi impoli, arogant, insultant, abusif ....
Je ne vois que des solutions - aucune solution. Aucune réponse n'a satisfait la question.
Merci pour vos efforts.
color_option
pour2
...--color
option a déjà la valeurauto
. Je ne sais tout simplement pas pourquoi vous ne pouvez pas l'activer par défaut.exec grep --color=auto "$@"
), éventuellement avec un nom différent (grepc
oucolorgrep
). Cela a une surcharge négligeable (et aucun processus simultané supplémentaire au moment de l'exécution). La raison pour laquelle vous les avez étiquetés "pas assez facile" est le fait que vous ne voyez pas cette fonctionnalité suffisamment utile pour consacrer l'effort ponctuel (relativement peu) de la mettre en œuvre et que vous cherchez quelqu'un d'autre pour le faire pour vous. Pour cette raison, vos commentaires "pas vraiment une réponse" aux réponses publiées sont assez grossiers.Réponses:
Certaines des raisons pour lesquelles OP a déclaré que les options n'étaient pas appropriées n'ont aucun fondement dans la réalité. Ici, je montre quel type d'effets en utilisant la stratégie 4 de OP a:
Sur la plupart des distributions,
grep
est installé dans/bin
(typique) ou/usr/bin
(OpenSUSE, peut-être d'autres), etPATH
contient par défaut/usr/local/bin
avant/bin
ou/usr/bin
. Cela signifie que si vous créez/usr/local/bin/grep
avecoù
/bin/sh
est un shell compatible POSIX fourni par votre distribution, généralement bash ou dash. Sigrep
est dedans/usr/bin
, alors faites çaLes frais généraux de ce script sont minimes. L'
exec
instruction signifie que l'interpréteur de script est remplacé par legrep
binaire; cela signifie que le shell ne reste pas en mémoire pendantgrep
son exécution. Ainsi, la seule surcharge est une exécution supplémentaire de l'interpréteur de script, c'est-à-dire une petite latence dans le temps d'horloge murale. La latence est à peu près constante (ne varie qu'en fonction de sigrep
etsh
déjà dans le cache de pages et de la quantité de bande passante d'E / S disponible), et ne dépend pas de la durée d'grep
exécution ou de la quantité de données qu'elle traite.Alors, quelle est la durée de cette latence, c'est-à-dire la surcharge ajoutée par le script wrapper?
Pour le savoir, créez le script ci-dessus et exécutez
Sur ma machine, la première prend 0,005 s en temps réel (sur un grand nombre de cycles), tandis que la seconde prend 0,006 s en temps réel. Ainsi, la surcharge d'utilisation de l'encapsuleur sur ma machine est de 0,001 s (ou moins) par appel.
C'est insignifiant.
Je ne vois également rien de "sale" à ce sujet, car de nombreuses applications et utilitaires courants utilisent la même approche. Pour voir la liste de ces éléments sur votre machine
/bin
et/usr/bin
exécutez simplementSur ma machine, la sortie comprend ci - dessus
egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
etxfig
que je l' utilise assez souvent. À moins que vous ne considériez votre distribution entière comme "sale" pour vous appuyer sur des scripts wrapper, vous n'avez aucune raison de considérer ces scripts wrapper comme "sales".En ce qui concerne les problèmes, un tel script wrapper peut provoquer:
Si seuls les utilisateurs humains (par opposition aux scripts) utilisent la version de grep qui prend par défaut le support des couleurs si la sortie est vers un terminal, alors le script wrapper peut être nommé
colorgrep
oucgrep
ou ce que l'OP juge bon.Cela évite tous les problèmes de compatibilité possibles, car le comportement de
grep
ne change pas du tout.Activation des
grep
options avec un script wrapper, mais d'une manière qui évite tout nouveau problème:Nous pouvons facilement réécrire le script wrapper pour prendre en charge une personnalisation
GREP_OPTS
même s'ilGREP_OPTIONS
n'était pas pris en charge (car il est déjà obsolète). De cette façon, les utilisateurs peuvent simplement ajouterexport "GREP_OPTIONS=--color=auto"
ou similaire à leur profil./usr/local/bin/grep
est alorsNotez qu'il n'y a pas de guillemets autour
$GREP_OPTIONS
, de sorte que les utilisateurs peuvent spécifier plusieurs options.Sur mon système, l'exécution
time /usr/local/bin/grep --version
avecGREP_OPTIONS
vide ou avecGREP_OPTIONS=--color=auto
est aussi rapide que la version précédente du script wrapper; c'est-à-dire, prend généralement une milliseconde de plus à exécuter que plaingrep
.Cette dernière version est celle que je recommanderais personnellement d'utiliser.
En résumé, la stratégie 4 d'OP:
est déjà recommandé par les
grep
développeursest trivial à implémenter (deux lignes)
a des frais généraux insignifiants (une latence supplémentaire d'une milliseconde par appel sur cet ordinateur portable particulier; facilement vérifiée sur chaque machine)
peut être implémenté comme un script wrapper qui ajoute un
GREP_OPTS
support (pour remplacer obsolète / non pris en chargeGREP_OPTIONS
)peut être implémenté (comme
colorgrep
/cgrep
) qui n'affecte pas du tout les scripts ou les utilisateurs existantsParce que c'est déjà une technique largement utilisée dans les distributions Linux, c'est une technique courante et non "sale".
S'il est implémenté comme un wrapper séparé (
colorgrep
/cgrep
), il ne peut pas créer de nouveaux problèmes car il n'affecte pas du tout legrep
comportement. S'il est implémenté en tant que script wrapper qui ajoute laGREP_OPTS
prise en charge, l'utilisationGREP_OPTS=--color=auto
présente exactement les mêmes risques (problèmes par rapport aux scripts existants) que l'ajout en amont par défaut--color=auto
. Ainsi, le commentaire selon lequel cela "crée plus de problèmes qu'il n'en résout" est complètement incorrect: aucun problème supplémentaire n'est créé.la source
La documentation que vous fournissez avec la première stratégie indique:
Donc, si l'alias vous est impossible, le script wrapper est le seul moyen.
la source
La raison pour laquelle la
GREP_OPTIONS
variable est obsolète est qu'elle a tendance à causer des problèmes lorsqu'ellegrep
est appelée quelque part dans un script et que le script ne fonctionne pas avec les options alternatives qui proviennent de la variable. Si vous écrivez un script wrapper pour,grep
vous rencontrez le même problème, sauf si vous lui donnez un nom différent .Alternativement, stockez vos options préférées dans une variable. Dans les shells autres que zsh, cela est fastidieux si les options contiennent des caractères génériques (
\[*?
), mais sinon vous pouvez simplement utiliser la variable sans guillemets pour obtenir une commande avec des arguments.Notez que GNU et BSD grep peuvent traiter une arborescence de répertoires de manière récursive, ce qui réduit la nécessité de les
find
combiner lagrep
plupart du temps.la source
grep
, vous avez besoin d'une commande avec un nom différent, ou bien si vous gardez le même nom, vous casserez les scripts qui attendent le comportement d'origine / standard. C'est le plus propre et ne cause pas de problèmes supplémentaires .Le plus simple est d'utiliser un alias (stratégie 3). Si vous vous souciez vraiment de la
xargs
commande, vous pouvez toujours la remplacer avec une fonction bash.Mais ce n'est pas mieux que d'utiliser une commande wrapper qui semble être la solution recommandée par l'
grep
équipe:À mon humble avis, vous devez contacter l'
grep
équipe de développement pour leur demander de fournir un remplacement simple à laGREP_OPTIONS
variable qui permettra la couleurgrep
selon une variable d'environnement.Il serait assez simple pour eux d'activer par défaut l'
color
option ou lorsque l'optionGREP_COLORS
a été définie.la source
C'est la solution de la première réponse de @NominalAnimal mais avec l'habituel
grep: ...
dans les avertissements (au lieu de/bin/grep: ...
):la source