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
grep
desenvolvedores -
é 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_OPTS
support (para substituirGREP_OPTIONS
com 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.