Quando usar o redirecionamento para stderr em shell scripts

15

Eu sei que utilitários bem comportados como grep geram mensagens "normais" para stdout e mensagens de erro para stderr.

$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory

Quando escrevo scripts de shell, muitas vezes acho difícil decidir qual saída e quais mensagens devo apresentar no stderr, ou se devo me incomodar.

Eu gostaria de saber sobre boas práticas: Quando está redirecionando alguma mensagem para stderr requerida e razoável, e quando não?

"Depende", claro, mas você tem algumas ideias que me ajudariam a tomar essas decisões?

Para que essa questão subjetiva se encaixe no formato, eu gostaria de encorajar respostas que abordem o "porquê" e sejam informadas pela experiência e, se possível, respaldadas por fatos.

    
por glts 13.06.2013 / 20:04

3 respostas

12

When I'm writing shell scripts myself I often find it hard to decide what output and which messages I should present on stderr, or if I should bother at all.

O silêncio é de ouro. Não sai nada se estiver tudo bem.

I'd like to know about good practice: When is redirecting some message to stderr called for and reasonable, and when not?

A maneira mais fácil de separar o stderr do stdout: imagine que toda a saída do seu script será redirecionada para outro comando via pipe. Nesse caso, você deve manter todas as notificações no stderr, pois essas informações inesperadas no stdout podem quebrar a sequência do pipe.

Também às vezes em canos como este:

command1 | while read line ; do command2 ; done | command3

você precisa passar algo de command2 para a saída dos usuários. A maneira mais fácil sem arquivos temporários é stderr.

    
por 13.06.2013 / 20:33
2

Eu geralmente escrevo tudo o que se relaciona com a operação do aplicativo para stderr , stdout é reservado para dados.

Imagine um aplicativo como cat . Quando você usá-lo para ler a entrada e passá-lo para outro aplicativo (através de um pipe), você não quer que a saída seja repleta de mensagens de status.

Tudo o que pode ser interessante para outro aplicativo ou um pós-processador para meu aplicativo vai para stdout , tudo o que está relacionado apenas ao interna do meu aplicativo vai para stderr .

    
por 13.06.2013 / 22:43
0

Minha preferência pessoal é enviar mensagens de erro e exceções para stderr e mensagens informativas para stdout . IMO, stderr é para quaisquer exceções e, portanto, minha convenção.

    
por 13.06.2013 / 20:11