Quando usar o fluxo de erro padrão no aplicativo de linha de comando?

9

Existe uma diretriz quando usar o erro ao escrever um aplicativo de linha de comando? Para minha surpresa, não encontrei nada ao pesquisá-lo.

Em particular, a questão com a qual estou preocupado agora é usar stdout ou stderr quando o usuário chamou o programa com argumentos ilegais. No entanto, uma resposta mais abrangente é muito apreciada porque este certamente não será o único caso em que uma regra clara é necessária para escrever um programa que se comporta da maneira esperada pelo usuário.

    
por UTF-8 12.01.2017 / 22:35

2 respostas

14

Sim, exiba uma mensagem em stderr quando os argumentos errados forem usados. E se isso também fizer com que o aplicativo saia, saia com status de saída diferente de zero.

Você deve usar o fluxo de erro padrão para mensagens de diagnóstico . As mensagens de diagnóstico incluem mensagens de erro, avisos e outras mensagens que não fazem parte da saída do utilitário quando estão funcionando corretamente ("corretamente", significando que não há nada de excepcional acontecendo, como arquivos não encontrados ou o que for).

Muitos shells (todos?) exibem prompts, o que o usuário digita e menus etc. em stderr , de modo que redirecionar stdout não o impeça de interagir com o shell de maneira significativa.

O que se segue é de uma publicação no blog sobre este tema:

This is a quote from Doug McIllroy, inventor of Unix pipes, explaining how stderr came to be. 'v6' is referring to a version of specific version of the original Unix operating system that was released in 1975.

All programs placed diagnostics on the standard output. This had always caused trouble when the output was redirected into a file, but became intolerable when the output was sent to an unsuspecting process. Nevertheless, unwilling to violate the simplicity of the standard-input-standard-output model, people tolerated this state of affairs through v6. Shortly thereafter Dennis Ritchie cut the Gordian knot by introducing the standard error file. That was not quite enough. With pipelines diagnostics could come from any of several programs running simultaneously. Diagnostics needed to identify themselves.
-- Doug McIllroy, "A Research UNIX Reader: Annotated Excerpts from the Programmer’s Manual, 1971-1986"

"identificar-se" significa simplesmente dizer "Ei! Sou eu falando! Isso deu errado: [...]":

$ ls nothere
ls: nothere: No such file or directory

É preferível fazer isso em stderr , pois, caso contrário, poderia ser lido pelo que estava lendo em stdout (mas nós não fazemos isso com ls de qualquer maneira , não é?).

    
por 12.01.2017 / 23:04
5

De especificações POSIX para os fluxos padrão:

At program start-up, three streams shall be predefined and need not be opened explicitly: standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output).

Em outras palavras, erros, informações de depuração e tudo o que entra na categoria de diagnóstico entra em stderr .

Veja a questão relacionada para obter mais informações: Os relatórios de progresso / informações de registro pertencem a stderr ou stdout?

    
por 13.01.2017 / 01:43