GREP_OPTIONS = --color = sempre é ignorado?

8

Eu estava brincando com o cenário GREP_OPTIONSe não conseguia fazê-lo funcionar. Apenas curioso sobre o porquê.

Saída de comandos de teste simples:

richard@ubuntu:~$ echo $GREP_OPTIONS

richard@ubuntu:~$ 

richard@ubuntu:~$ ls | grep o 
Desktop
downloads
Dropbox
ebooks
workspace

richard@ubuntu:~$ ls | grep o --color=always | less -R 

richard@ubuntu:~$ export GREP_OPTIONS="--color=always" 
richard@ubuntu:~$ ls | grep o  | less -R 
  1. O 1º grep é emitido para o terminal em cores (cada 'o' é vermelho)
  2. O segundo grep gera menos cores (o mesmo que 1)
  3. Mas o terceiro grep gera menos, mas em preto e branco - mas isso deve ser colorido.

Portanto, parece que o grep está ignorando GREP_OPTIONS. Isso é um bug ou estou fazendo algo errado?

(Ubuntu 12.04.2, GNU grep 2.10)

Richard
fonte
grep v3.1reclama em voz alta de GREP_OPTIONStodas as invocações:grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Tom Hale
Eu uso: alias grep='GREP_COLOR="1;33;40" LANG=C grep --color=auto'para destacar em amarelo.
Tom Hale #:

Respostas:

11

Se grep oproduz saída colorida, grepé um alias para grep --color=autoou grep --color=always(ou possivelmente mais opções) ou GREP_OPTIONSé definido como um valor que contém --color=autoou --color=always. Como $GREP_OPTIONSestá vazio, deve ser o alias.

Como grep o | less -Rnão mostra cores, o alias deve ser grep --color=auto(uma escolha sensata). Com o alias, o grepcomando sempre recebe a --coloropção na linha de comando, e isso tem precedência sobre a variável de ambiente.

Se você deseja usar a variável de ambiente, remova a definição de alias da sua ~/.bashrc, ou para uma execução de sessão unalias grep. Você pode substituir alias grep='grep --color=auto'por export GREP_OPTIONS='--color=auto': eles têm essencialmente o mesmo significado, exceto que:

  • definir GREP_OPTIONSum valor diferente somente substitui o último;
  • o alias só entra em ação quando você executa a greppartir de um shell interativo, enquanto a configuração GREP_OPTIONStambém se aplica quando grepé executada a partir de scripts e outros aplicativos.

Nunca coloque --color=alwaysou a maioria das outras opções GREP_OPTIONS: isso interromperia muitos programas que analisam a saída de grep. --color=autoé a única opção segura a ser adotada GREP_OPTIONS. Para qualquer outra coisa, use o alias. Versões futuras do GNU grep deixarão o suporte para a opção por esse motivo.

Observe que a definição de alias entra ~/.bashrc(é uma configuração de shell), enquanto a definição de variável de ambiente entra ~/.profile(é uma configuração de sessão). Consulte Existe um arquivo equivalente ".bashrc" lido por todos os shells?

Se você deseja executar o comando sem serrilhado apenas uma vez, execute em \grepvez de grep(citar qualquer parte do nome ignora a pesquisa de alias).

Gilles 'SO- parar de ser mau'
fonte
Sim, você está certo, executando \ grep ... mostra corretamente. Obrigado pela dica de bônus por me aconselhar a não usar "= always" no .bashrc. 1
Richard
1
Observe que GREP_OPTIONSestá obsoleto em favor da aliasvariante.
Todos os trabalhadores são essenciais