O que a opção grep --color = auto faz?


8

Que efeito tem autouma opção para o --colorswitch no grep? Quando o grep decide colorir as seqüências correspondentes e quando não?

Respostas:


12

Comportamento esperado

Com --color=auto, grep destacará as strings correspondentes se (e somente se) a saída for gravada diretamente no terminal e o referido terminal for capaz de exibir uma saída colorida.

Normalmente, --color=autoé o que você quer. Se, por exemplo, você usar grep para corresponder a uma URL e canalizá-la para o Wget, o Wget verá em \e[1;31mhttp://...vez da URL real (e sufocará).

Os seguintes comandos devem resultar em saída colorida:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

Este comando, no entanto, não deve:

echo Super User | grep --color=auto Super | cat

Qualquer inconsistência com esse comportamento deve ser considerada um bug.

Código fonte

Com --color=auto, a versão mais recente do Grep for Windows (2.5.4) - assim como a versão 2.5.4 original - baseia a saída da cor se e somente se a condição

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

é verdadeiro, isto é, se e somente se a saída estiver sendo gravada em um terminal, a variável de ambienteTERM é definida e o terminal não é burro .

Isso não produzirá o comportamento desejado no Windows, pois TERMnormalmente não está definido. Uma solução fácil para esse problema é configurá-lo TERM=windowsno painel de controle.

A versão mais recente do grep (2.14) corrige esse problema colorindo a saída se e somente se a condição

isatty(STDOUT_FILENO) && should_colorize()

é verdadeiro, onde should_colorize()é definido de maneira diferente para POSIX e Win32:

Para o primeiro, a condição é equivalente à de 2.5.4; para este último, a variável de ambiente TERMnão precisa ser definida (apenas não pode ser dumb).


Como ele descobre se escreve no terminal ou não?
Trolzen

11
Há uma função C para isso. Se você incluir o arquivo de cabeçalho sdgstd.h, istty(stdout)retornará 0se a saída for redirecionada para um arquivo.
Dennis

Eu experimento com portas do Windows grepe lessdo projeto GnuWin (gnuwin32.sourceforge.net). cmd.exeé aprimorado com ansiconutilidade. less --color=autofunciona como esperado: usa cores quando nenhum redirecionamento é aplicado e não quando a saída é redirecionada. Mas grep --color=autonão imprime seqüências de escape nos dois casos.
12302 Trolzen

Não consigo entender por que isso acontece. Eu pensei que esses utilitários tivessem o mesmo código nas versões unix e windows e são bastante antigos. Então eles devem se comportar de forma idêntica.
30912 Trolzen

Isso é um bug no grep do GnuWin32 então. No Ubuntu, ele se comporta conforme detalhado na minha resposta. Embora ambos sejam derivados do mesmo código-fonte, sempre há pequenos ajustes que precisam ser feitos se você for compilar em outra plataforma. Além disso, lembre-se de que a versão atual do grep do GnuWin32 é 2.5.4. A versão mais recente no Ubuntu é 2.12.
Dennis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.