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'
/foo/bar/denied/libGL.so.1, combinandostdoutestderr, em seguida, filtrando iria esconder o resultado