sexta-feira, 24 de maio de 2013

Como redirecionar a saída de erro (stderr) para stdout ou arquivo [Linux]

 

Situação normal no Linux é executar um comando direcionando sua saída para um arquivo (ou outro comando, como less) e ver que os erros não são direcionados corretamente, embora apareçam na tela. Por que isso acontece e como resolver?

stdin, stdout e stderr

Existem três streams de dados padrão em todo ambiente Linux:

stdin
Entrada padrão de dados para o programa
stdout
Saída padrão de dados do programa
stderr
Saída padrão de erro

Os programas recebem dados na stdin toda vez que você direciona algo para ele usando o pipe (comando | outro_comando) ou direciona o conteúdo de um arquivo (comando < arquivo.txt).

O resultado da execução de um programa em geral é jogado na saída padrão (stdout) e os erros na stderr. Embora apareça tudo na tela, na verdade saem por canais diferentes que desembocam no console.

Só que quando você usa direciona a saída usando um pipe ou ">" apenas a stdout é direcionada, a strerr continua indo para a tela. Para modificar esse fluxo, podem ser usados os artifícios abaixo:

AçãoComando
Redirecionar saída (stdout) para arquivocomando > saida.txt
Redirecionar stderr para stdoutcomando 2>&1
Redirecionar stderr para stdout e então para arquivocomando 2>&1 > saida.txt
Redirecionar stderr e stdout direto para arquivocomando &> arquivo.txt

Esse tipo de redirecionamento pode ser particularmente útil em scripts que rodam no cron, em que a saída stdout é direcionada para /dev/null mas stdout continua indo para o e-mail do administrador.

Nenhum comentário:

Postar um comentário