Nos sistemas tipo Unix, existem dois caminhos de saída que, se não modificados, enviarão a saída para sua tela. Erro padrão (ou stderr) é aquele que captura a maioria das falhas e condições de erro.
Para passar a mensagem de permissão negada no stderr para o mesmo fluxo de saída que "saída regular", você deve combinar os dois. No seu exemplo, para que você grep -v
opere corretamente, você combina stdout (saída padrão) e stderr com a sintaxe arcana que vê.
Na seção do manual do GNU Bash, seção 3.2.2 Pipelines :
Se ' |&
' é utilizado, comando1 é o erro padrão, para além da sua saída padrão, está ligado a comando2 de entrada padrão através do tubo; é uma abreviação de 2>&1 |
. Esse redirecionamento implícito do erro padrão para a saída padrão é executado após qualquer redirecionamento especificado pelo comando.
Além disso, como geirha aponta, se você quiser se livrar da saída stderr, faça algo como
find -name 'myfile.*' 2> /dev/null
ou talvez
find -name 'myfile.*' 2> /tmp/errorlog
E observe que, se você tiver cadeias de comandos, como find
passar sua saída para xargs
você, precisará colocar todo o pipeline de comandos entre parênteses para capturar a saída de todos os componentes do comando. Por exemplo,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Se você deixou de fora os parênteses, e fez isso em vez disso -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
você ainda verá erros de permissão negados na localização ou no egrep, mas o stderr será redirecionado para xargs.
Como você viu, provavelmente jogaria fora o stderr somente depois de visualizar seu conteúdo durante uma execução de teste.
Observe que, com o GNU find
e até onde eu sei, qualquer compatível com POSIX find
, a -print
opção está implícita. Você ainda pode fornecê-lo explicitamente, se quiser.