Por que não usa grep aqui?

15

Eu tenho o seguinte comando:

find / -name libGL.so.1

Que retorna muitas linhas com "Permissão negada". Desejo excluir essas linhas, então adicionei o seguinte:

find / -name libGL.so.1 | grep -v 'denied'

Mas a saída é a mesma - meu grep -v 'denied' não está filtrando as linhas com Permission denied . Eu tentei muitas variações, olhei tutoriais grep, mas não consigo descobrir o problema. Alguma sugestão?

    
por modulitos 12.05.2014 / 02:42

4 respostas

35

Isso não tem nada a ver com grep - é porque o canal | redireciona o fluxo de saída padrão stdout , enquanto as mensagens Permission denied estão no fluxo de erro padrão stderr . Você poderia alcançar o resultado desejado combinando os fluxos usando 2>&1 (redirecionar o fluxo cujo descritor de arquivo é 2 para o fluxo cujo descritor de arquivo é 1 ) para que stderr e stdout sejam canalizados para a entrada do comando grep

find / -name libGL.so.1 2>&1 | grep -v 'denied'

mas seria mais comum simplesmente descartar stderr ao redirecioná-lo para /dev/null

find / -name libGL.so.1 2>/dev/null

Usando | & em vez de 2 > & 1 |

Se você der uma olhada na página de manual do Bash, provavelmente notará esta sinopse:

If |& is used, the standard error of command is connected to command2's standard input through the pipe; it is shorthand for 2>&1 |.

Você também pode usar essa construção também se quiser juntar STDERR e STDOUT:

find / -name libGL.so.1 |& grep -v 'denied'
    
por 12.05.2014 / 03:01
5

Seu comando deve ser:

find / -name libGL.so.1 2>/dev/null

Encontrar está reclamando sobre permissões no erro padrão (fd2). Para eliminar essas linhas, redirecione (>) para o intervalo de bits (/ dev / null).

    
por 12.05.2014 / 03:00
4

As linhas de "permissão negada" estão indo para o fluxo stderr (erro padrão), mas você está canalizando o stdout (saída padrão) pelo grep.

Você pode redirecionar o stderr completamente com

find / -name libGL.so.1 2> /dev/null
    
por 12.05.2014 / 03:01
2

Já tentou chamar o comando com sudo ?

sudo find / -name libGL.so.1

Se ainda mostrar a mensagem, use o redirecionamento já mencionado de stderr (fd = 2) para nirvana (/ dev / null) :

sudo find / -name libGL.so.1 2> /dev/null

Mais ideias aqui , boa sorte!

    
por 12.05.2014 / 04:04

Tags