Algumas das razões pelas quais OP afirmou que as opções são inadequadas não têm base na realidade. Aqui, eu mostro que tipo de efeitos usando a estratégia 4 do OP tem:
Na maioria das distribuições, grep está instalado em /bin (típico) ou /usr/bin (OpenSUSE, talvez outros) e o padrão PATH contém /usr/local/bin antes de /bin ou /usr/bin . Isto significa que se você criar /usr/local/bin/grep com
#!/bin/sh
exec /bin/grep --color=auto "$@"
onde /bin/sh é um shell compatível com POSIX fornecido pela sua distribuição, geralmente bash ou dash. Se grep estiver em /usr/bin , faça isso
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
A sobrecarga desse script é mínima. A instrução exec significa que o interpretador de script é substituído pelo grep binário; isso significa que o shell não permanece na memória enquanto grep está sendo executado. Assim, a única sobrecarga é uma execução extra do interpretador de script, isto é, uma pequena latência no tempo de relógio de parede. A latência é aproximadamente constante (varia somente dependendo se grep e sh já estão no cache de páginas ou não, e em quanto de largura de banda de E / S está disponível) e não depende de quanto tempo grep é executado ou quantos dados processa.
Então, quanto tempo dura essa latência, ou seja, a sobrecarga adicionada pelo script wrapper?
Para descobrir, crie o script acima e execute
time /bin/grep --version
time /usr/local/bin/grep --version
Na minha máquina, o primeiro leva 0,005s em tempo real (através de um grande número de corridas), enquanto o último leva 0,006s em tempo real. Assim, a sobrecarga de usar o wrapper na minha máquina é 0,001s (ou menos) por invocação.
Isso é insignificante.
Eu também não consigo ver nada "sujo" sobre isso, porque muitos aplicativos e utilitários comuns usam a mesma abordagem. Para ver a lista de tal na sua máquina em /bin e /usr/bin , basta executar
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Na minha máquina, a saída acima inclui egrep , fgrep , zgrep , which , 7z , chromium-browser , ldd e xfig , que eu uso com bastante frequência. A menos que você considere toda a sua distribuição "suja" por depender de scripts de wrapper, você não tem motivos para considerar esses scripts de wrapper "sujos".
Quanto a problemas como esse script de wrapper pode causar:
Se apenas usuários humanos (em oposição a scripts) estiverem usando a versão do grep que padroniza o suporte a cores se a saída for para um terminal, o script do wrapper pode ser denominado colorgrep ou cgrep ou qualquer que seja o OP ajuste.
Isso evita todos os possíveis problemas de compatibilidade, porque o comportamento de grep não é alterado.
Ativando grep opções com um script de wrapper, mas de uma maneira que evite novos problemas:
Podemos facilmente reescrever o script wrapper para suportar um GREP_OPTS personalizado, mesmo se GREP_OPTIONS não fosse suportado (pois já está obsoleto). Dessa forma, os usuários podem simplesmente adicionar export "GREP_OPTIONS=--color=auto" ou semelhante ao perfil deles. /usr/local/bin/grep é então
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Observe que não há cotações em torno de $GREP_OPTIONS , para que os usuários possam especificar mais de uma opção.
No meu sistema, executar time /usr/local/bin/grep --version com GREP_OPTIONS empty ou GREP_OPTIONS=--color=auto é tão rápido quanto a versão anterior do script wrapper; isto é, normalmente leva um milissegundo a mais para executar do que o simples grep .
Esta última versão é a que eu pessoalmente recomendo para uso.
Em resumo, a estratégia do OP 4:
-
é recomendado por
grepdesenvolvedores -
é trivial para implementar (duas linhas)
-
tem uma sobrecarga insignificante (um milissegundo de latência extra por chamada neste laptop em particular; facilmente verificado em cada máquina)
-
pode ser implementado como um script de wrapper que adiciona
GREP_OPTSsupport (para substituirGREP_OPTIONScom descontinuidade / sem suporte) -
pode ser implementado (como
colorgrep/cgrep) que não afeta scripts ou usuários existentes em todos os
Como é uma técnica amplamente usada nas distribuições Linux, é uma técnica comum e não "suja".
Se implementado como um wrapper separado ( colorgrep / cgrep ), ele não poderá criar novos problemas, pois não afeta o comportamento grep . Se implementado como um script de wrapper que adiciona GREP_OPTS support, usar GREP_OPTS=--color=auto tem exatamente os mesmos riscos (wrt. Problemas com scripts existentes) que o upstream adicionaria o padrão --color=auto . Assim, o comentário de que isso "cria mais problemas do que resolve" está completamente incorreto: nenhum problema adicional é criado.