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, grepest installé dans /bin(typique) ou /usr/bin(OpenSUSE, peut-être d'autres), et PATHcontient par défaut /usr/local/binavant /binou /usr/bin. Cela signifie que si vous créez /usr/local/bin/grepavec
#!/bin/sh
exec /bin/grep --color=auto "$@"
où /bin/shest un shell compatible POSIX fourni par votre distribution, généralement bash ou dash. Si grepest dedans /usr/bin, alors faites ça
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Les frais généraux de ce script sont minimes. L' execinstruction signifie que l'interpréteur de script est remplacé par le grepbinaire; cela signifie que le shell ne reste pas en mémoire pendant grepson 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 si grepet shdé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' grepexé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
time /bin/grep --version
time /usr/local/bin/grep --version
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 /binet /usr/binexécutez simplement
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Sur ma machine, la sortie comprend ci - dessus egrep, fgrep, zgrep, which, 7z, chromium-browser, lddet xfigque 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é colorgrepou cgrepou ce que l'OP juge bon.
Cela évite tous les problèmes de compatibilité possibles, car le comportement de grepne change pas du tout.
Activation des grepoptions 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_OPTSmême s'il GREP_OPTIONSn'était pas pris en charge (car il est déjà obsolète). De cette façon, les utilisateurs peuvent simplement ajouter export "GREP_OPTIONS=--color=auto"ou similaire à leur profil. /usr/local/bin/grepest alors
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Notez 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 --versionavec GREP_OPTIONSvide ou avec GREP_OPTIONS=--color=autoest 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 plain grep.
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 grepdéveloppeurs
est 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_OPTSsupport (pour remplacer obsolète / non pris en charge GREP_OPTIONS)
peut être implémenté (comme colorgrep/ cgrep) qui n'affecte pas du tout les scripts ou les utilisateurs existants
Parce 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 le grepcomportement. S'il est implémenté en tant que script wrapper qui ajoute la GREP_OPTSprise en charge, l'utilisation GREP_OPTS=--color=autopré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éé.