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), et PATH
contient par défaut /usr/local/bin
avant /bin
ou /usr/bin
. Cela signifie que si vous créez /usr/local/bin/grep
avec
#!/bin/sh
exec /bin/grep --color=auto "$@"
où /bin/sh
est un shell compatible POSIX fourni par votre distribution, généralement bash ou dash. Si grep
est 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' exec
instruction signifie que l'interpréteur de script est remplacé par le grep
binaire; cela signifie que le shell ne reste pas en mémoire pendant grep
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 si grep
et sh
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
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 /bin
et /usr/bin
exé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
, ldd
et xfig
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
ou cgrep
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'il GREP_OPTIONS
n'é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/grep
est 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 --version
avec GREP_OPTIONS
vide ou avec GREP_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 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 grep
dé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_OPTS
support (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 grep
comportement. S'il est implémenté en tant que script wrapper qui ajoute la GREP_OPTS
prise en charge, l'utilisation GREP_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éé.