Devo avisos de saída para STDERR ou STDOUT?
Pergunta
Eu estou fazendo um script que lida com um conjunto predefinido de dados, a saída para um arquivo. Quero aparecer um aviso quando um datum (que é sempre "Regular" em cada set que eu tive acesso a) é diferente afirmando que este valor não for tratada (desde que eu não sei como isso afeta os dados). Devo saída este aviso para stderr ou stdout?
Solução
Se eu salvou a saída desse script (ou seja stdout apenas) para que eu pudesse processá-lo mais tarde, se esse aviso interferir com a forma como a saída é analisado? Além disso, se a saída é canalizada para outro processo, o aviso deve aparecer no terminal, de modo que o usuário vê-lo imediatamente.
Por essas razões, em geral, você saída avisos para stderr.
Outras dicas
O aviso deve ir para stderr.
Além dos pontos apresentados por outros (que causam erros de análise de processos a jusante e escondendo o erro do usuário no console), não é uma questão de flexibilidade.
Se o usuário não quiser que o aviso de stderr para ir para um processo a jusante que está analisando stdout, eles não têm que fazer nada especial.
your_script | downstream_process
Se o usuário quer o aviso de stderr para ir para um processo a jusante que irá analisar stdout e stderr, o usuário pode usar 2> & 1 para redirecionar stderr para stdout.
your_script 2>&1 | downstream_process
Se você saída ambos os avisos e quaisquer dados normais para stdout, o usuário não tem uma boa maneira de separar os avisos a partir dos dados sem analisar tudo. Assim, o envio de avisos para stderr dá seu script mais flexibilidade também.
A verdadeira questão é: se alguém redirecionar a saída do seu script em um arquivo, você iria querer o aviso colocado no arquivo, ou dirigida para o usuário
?Se você está esperando o usuário a tomar algumas medidas, como resultado do aviso, ele deve ir para STDERR. Se algum script jusante é susceptível de ser desarmado pelo aviso, ele deve ir para STDERR.