Quero saída colorida de grep
.
.... Mas
- Estratégia 1: GREP_OPTIONS. Mas isso está obsoleto. Consulte http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- Stragegy 2: GREP_COLORS parece uma solução à primeira vista, mas isso faz algo diferente.
- Estratégia 3: alias. Isso não funciona
find ... | xargs grep
, pois o xargs não avalia aliases. - Estratégia 4: Escreva um script de wrapper simples. Não, acho que isso é muito sujo e cria mais problemas do que resolve.
- Estratégia 5: corrigir o código fonte
- Estratégia 6: entre em contato com desenvolvedores grep, solicite uma substituição de GREP_OPTIONS
- Estratégia AGRADÁVEL e FÁCIL: ... isso está faltando. Eu não tenho idéia.
Como resolver isso?
Obrigado por tentar ajudar!
... mas não posso dar a recompensa
Chame-me rude, arogante, insultuoso, abusivo ....
Só vejo soluções alternativas - sem solução. Nenhuma resposta satisfez a pergunta.
Obrigado por seus esforços.
color_option
de2
...--color
opção já tem o valorauto
. Só não sei por que você não pode ativá-lo por padrão.exec grep --color=auto "$@"
), opcionalmente com um nome diferente (grepc
oucolorgrep
). Isso tem sobrecarga negligenciável (e nenhum processo simultâneo extra em tempo de execução). A razão pela qual você os rotulou "não é fácil o suficiente" é o fato de você não ver esse recurso útil o suficiente para gastar o (relativamente pequeno) esforço único para implementá-lo e está procurando alguém para fazer isso por você. Por esse motivo, seus comentários "não são realmente uma resposta" para as respostas postadas são bastante rudes.Respostas:
Alguns dos motivos pelos quais a OP declarou que as opções são inadequadas não têm base na realidade. Aqui, mostro que tipo de efeitos usando a estratégia 4 do OP:
Na maioria das distribuições,
grep
é instalado em/bin
(típico) ou/usr/bin
(OpenSUSE, talvez outros), e o padrãoPATH
contém/usr/local/bin
antes/bin
ou/usr/bin
. Isso significa que se você criar/usr/local/bin/grep
comonde
/bin/sh
é um shell compatível com POSIX fornecido pela sua distribuição, geralmente bash ou dash. Segrep
estiver dentro/usr/bin
, faça issoA sobrecarga desse script é mínima. A
exec
declaração significa que o interpretador de script é substituído pelogrep
binário; isso significa que o shell não permanece na memória enquantogrep
está sendo executado. Portanto, a única sobrecarga é uma execução extra do interpretador de script, ou seja, uma pequena latência no tempo do relógio de parede. A latência é mais ou menos constante (só varia dependendo segrep
esh
já estão no cache de página ou não, e de quanto I / O largura de banda disponível), e não depende de quanto tempogrep
executa ou quantos dados que processa.Então, quanto tempo dura essa latência, ou seja, a sobrecarga adicionada pelo script do wrapper?
Para descobrir, crie o script acima e execute
Na minha máquina, o primeiro leva 0,005s em tempo real (em um grande número de execuções), enquanto o último leva 0,006s em tempo real. Portanto, a sobrecarga do uso do wrapper na minha máquina é de 0,001s (ou menos) por chamada.
Isso é insignificante.
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 deles na sua máquina
/bin
e/usr/bin
, basta executarNa minha máquina, a saída acima inclui
egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
, exfig
, que eu uso com bastante frequência. A menos que você considere sua distribuição inteira "suja" por confiar em scripts de wrapper, você não tem motivos para considerar esses scripts de wrapper "sujos".Quanto aos problemas que um script de wrapper pode causar:
Se apenas usuários humanos (em oposição a scripts) estiverem usando a versão do grep que possui como padrão o suporte a cores se a saída for para um terminal, o script do wrapper poderá ser nomeado
colorgrep
oucgrep
ou o que o OP considerar adequado.Isso evita todos os possíveis problemas de compatibilidade, porque o comportamento de
grep
não muda.Ativando
grep
opções com um script de wrapper, mas de uma maneira que evite novos problemas:Podemos reescrever facilmente o script do wrapper para suportar um costume,
GREP_OPTS
mesmo queGREP_OPTIONS
não tenha sido suportado (como ele já foi descontinuado). Dessa forma, os usuários podem simplesmente adicionarexport "GREP_OPTIONS=--color=auto"
ou semelhante ao seu perfil./usr/local/bin/grep
é entãoObserve que não há aspas
$GREP_OPTIONS
, para que os usuários possam especificar mais de uma opção.No meu sistema, executar
time /usr/local/bin/grep --version
comGREP_OPTIONS
vazio, ou comGREP_OPTIONS=--color=auto
, é tão rápido quanto a versão anterior do script do wrapper; isto é, normalmente leva um milissegundo a mais para ser executado do que simplesgrep
.Esta última versão é a que eu pessoalmente recomendo para uso.
Em resumo, a estratégia 4 do OP:
já é recomendado pelos
grep
desenvolvedoresé trivial de implementar (duas linhas)
possui sobrecarga insignificante (uma latência extra de milissegundos por chamada neste laptop em particular; facilmente verificável em cada máquina)
pode ser implementado como um script de wrapper que adiciona
GREP_OPTS
suporte (para substituir obsoleto / não suportadoGREP_OPTIONS
)pode ser implementado (como
colorgrep
/cgrep
) que não afeta scripts ou usuários existentesPor ser uma técnica amplamente utilizada nas distribuições Linux, é uma técnica comum e não "suja".
Se implementado como um wrapper separado (
colorgrep
/cgrep
), não poderá criar novos problemas, pois não afeta ogrep
comportamento. Se implementado como um script de wrapper que adicionaGREP_OPTS
suporte, o usoGREP_OPTS=--color=auto
tem exatamente os mesmos riscos (problemas graves com scripts existentes) que a adição de upstream padrão--color=auto
teria. Portanto, o comentário de que isso "cria mais problemas do que resolve" é completamente incorreto: nenhum problema adicional é criado.fonte
A documentação que você fornece com a primeira estratégia diz:
Portanto, se o alias for impossível para você, o script do wrapper é a única maneira.
fonte
A razão pela qual a
GREP_OPTIONS
variável foi descontinuada é que ela tende a causar problemas quandogrep
é chamada em algum lugar de um script e o script não funciona com as opções alternativas que vêm da variável. Se você escrever um script de wrappergrep
, terá o mesmo problema, a menos que dê um nome diferente .Como alternativa, armazene suas opções favoritas em uma variável. Em shells diferentes de zsh, isso é complicado se as opções contiverem caracteres curinga (
\[*?
), mas, caso contrário, você poderá usar a variável não citada para obter um comando com argumentos.Note que o GNU e o BSD grep podem processar uma árvore de diretórios recursivamente, o que alivia a necessidade
find
em combinação com agrep
maior parte do tempo.fonte
grep
, precisará de um comando com um nome diferente ou, se mantiver o mesmo nome, interromperá os scripts que esperam o comportamento original / padrão. Essa é a mais limpa e não causa problemas adicionais .O mais fácil é usar um alias (estratégia 3). Se você realmente se importa com o
xargs
comando, ainda pode substituí-lo por uma função bash.Mas isso não é melhor do que usar um comando wrapper que parece ser a solução recomendada pela
grep
equipe:Na minha humilde opinião, você deve entrar em contato com a
grep
equipe de desenvolvedores para solicitar uma substituição simples daGREP_OPTIONS
variável que habilitará a cor degrep
acordo com alguma variável de ambiente.Seria bastante simples para eles habilitar por padrão a
color
opção ou quandoGREP_COLORS
ela foi definida.fonte
Esta é a solução da resposta principal de @NominalAnimal, mas com o habitual
grep: ...
nos avisos (em vez de/bin/grep: ...
):fonte