Em sistemas semelhantes ao Unix, existem dois caminhos de saída que, se não forem 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 como "saída regular", você deve combinar os dois. No seu exemplo, para que o grep -v
funcione corretamente, você combina stdout (saída padrão) e stderr com a sintaxe arcana que você vê.
De manual do GNU Bash seção 3.2.2 Oleodutos :
Se "
|&
" for usado, o erro padrão de comando1 , além de seu saída padrão, está conectada à entrada padrão do comando2 o cano; é uma abreviação de2>&1 |
. Este redirecionamento implícito de o erro padrão para a saída padrão é executado após qualquer redirecionamentos especificados pelo comando.
Além disso, como o geirha aponta, se você quiser apenas se livrar da saída do stderr, você deve fazer algo como
find -name 'myfile.*' 2> /dev/null
ou talvez
find -name 'myfile.*' 2> /tmp/errorlog
E observe que, se você tiver sequências de comandos, como find
passando sua saída para xargs
, precisará colocar o pipeline inteiro 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 veria a permissão negada erros no find ou no egrep, mas o stderr seria redirecionado para xargs.
Como você viu, você provavelmente jogaria fora o stderr somente depois de ver seu conteúdo durante um teste.
Note que com o GNU find
e, até onde eu sei, qualquer find
compatível com POSIX, a opção -print
é implícita. Você ainda pode fornecê-lo explicitamente, se quiser.