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ção | Comando |
---|---|
Redirecionar saída (stdout) para arquivo | comando > saida.txt |
Redirecionar stderr para stdout | comando 2>&1 |
Redirecionar stderr para stdout e então para arquivo | comando 2>&1 > saida.txt |
Redirecionar stderr e stdout direto para arquivo | comando &> 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