Por que o grep usando pipe não funciona aqui?

Por que o grep usando pipe não funciona aqui?

Eu tenho o seguinte comando:

find / -name libGL.so.1

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 - my grep -v 'denied'não está filtrando as linhas com Permission denied. Eu tentei muitas variações, examinei os tutoriais do grep, mas não consigo descobrir o problema. Alguma sugestão?

Responder1

Isso não tem nada a ver grep- é porque o canal |redireciona o fluxo de saída padrão stdoutenquanto as Permission deniedmensagens estão no fluxo de erro padrão stderr. Você pode obter o resultado desejado combinando os fluxos usando 2>&1(redirecionar o fluxo cujo descritor de arquivo é 2para o fluxo cujo descritor de arquivo é 1) para que stderrtambém 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á esta sinopse:

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

Portanto, você também pode usar esta construção se quiser juntar STDERR e STDOUT:

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

Responder2

Seu comando deve ser:

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

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

Responder3

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

Você pode redirecionar totalmente o stderr com

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

Responder4

Você já tentou chamar o comando comsudo?

sudo find / -name libGL.so.1

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

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

Mais ideiasaqui, boa sorte!

informação relacionada