Por que a saída do grep no xargs não funciona com cores?

2

Eu tenho um problema estranho. Meu grep tem saída colorida e, se eu fizer algo assim:

grep -lr '80' /etc/apache2/sites-available/|xargs ls

Eu tenho:

ls: cannot access /etc/apache2/sites-available/default: No such file or directory

Mas se eu adicionar --colour=none a grep , tudo está OK.

Onde estou errado?

    
por loadaverage 12.02.2013 / 08:05

3 respostas

1

Poderia ser um alias quebrado. Dê uma olhada no seu /home/USERNAME/.bashrc (/root/.bashrc) Se você ver um

alias grep="grep -ARG1 -ARG2"

remova-o ou personalize-o como quiser.

    
por 12.02.2013 / 09:01
4

Where am I wrong?

Aqui está o problema: Você está analisando a saída de um comando que cria nomes de arquivos. Você deve nunca fazer isso. E se você fizer isso, você precisa ter certeza de que a saída está bem formada e os nomes dos arquivos estão devidamente delimitados. *

Normalmente, os nomes dos arquivos de tubulação para xargs "simplesmente funcionam" e é uma solução "boa o suficiente", mas não funcionará se o comando estiver inserindo caracteres de controle de cores em sua stdout. A saída deve ser legível para humanos, em um terminal e não por outros comandos.

A verdadeira questão é: Por que você está fazendo | xargs ls quando grep já imprime os nomes dos arquivos?

* Por exemplo, find … -print0 | xargs -0 é uma construção que delimita arquivos com o único caractere que não é permitido em nomes de arquivos, então você estará seguro lá. No entanto, na maioria desses casos, find … -exec funcionará bem.

    
por 12.02.2013 / 08:41
1

Normalmente, há [0] 3 argumentos que podem ser usados com a opção --color para grep : "auto", "always" e "none". Parece que seu grep pode ser alias para usar --color always , nesse caso os códigos de escape ANSI usados para colorir a saída estão interferindo na capacidade de ls de mostrá-los. Quando você usa --color=none , você diz grep para não usá-los, corrigindo seu problema. A opção auto é um bom compromisso: ela diz para usar cores quando a saída é um terminal, mas não para se a saída é um arquivo ou pipeline, ou geralmente outra coisa onde os códigos ANSI não funcionarão como pretendido. p>

Dito isso, o slhck está certo e você provavelmente não precisa canalizar a saída de grep para nada neste caso, mas é bom entender os problemas relacionados a cores para o futuro.

[0] Eu digo tipicamente, porque meu man page diz que você pode usar "never", "always" e "auto". Talvez "nenhum" e "nunca" sejam sinônimos.

    
por 12.02.2013 / 20:11