Por que grep usando pipe não funciona aqui?

18

Eu tenho o seguinte comando:

find / -name libGL.so.1

O que retorna muitas linhas com "Permissão negada". Quero excluir essas linhas, então adicionei o seguinte:

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

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

modulitos
fonte

Respostas:

43

Isso não tem nada a ver com grepisso - é porque o canal |redireciona o fluxo de saída padrão, stdoutenquanto as Permission deniedmensagens estão no fluxo de erros padrão stderr. Você pode obter o resultado desejado combinando os fluxos usando 2>&1(redirecione o fluxo cujo descritor de arquivo é 2para o fluxo cujo descritor de arquivo é 1) para que stderr, assim como stdoutseja canalizado para a entrada do comando grep

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

mas seria mais comum simplesmente descartar stderrcompletamente, redirecionando-o 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á este anúncio:

Se |&usado, o erro padrão de comando é conectado à entrada padrão do command2 através do tubo; é uma abreviação de 2>&1 |.

Portanto, você também pode usar essa construção se desejar ingressar em STDERR e STDOUT:

find / -name libGL.so.1 |& grep -v 'denied'
chave de aço
fonte
3
Nota adicional sobre combinando-os: Se por algum motivo bizarro o arquivo existe no /foo/bar/denied/libGL.so.1, combinando stdoute stderr , em seguida, filtrando iria esconder o resultado
Izkata
5

Seu comando deve ser:

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

A Find está reclamando das permissões do erro padrão (fd2). Para eliminar essas linhas, redirecione (>) o padrão para o bit bucket (/ dev / null).

snakeroot
fonte
4

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

Você pode redirecionar completamente o stderr com o

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

Você já tentou chamar o comando com sudo ?

sudo find / -name libGL.so.1

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

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

Mais ideias aqui , boa sorte!

manamana
fonte