A mensagem de uso deve ir para stderr ou stdout?


29

A mensagem de uso impressa com, por exemplo,

 command -?

de um comando Unix vá para stderr ou stdout, e por quê? Ele deve ir para o mesmo local se o usuário cometer um erro com uma opção?


4
Nota adicional: não use -? use --help e -h Porque --help e -h são padrão e porque -? vontade pode ser interpretada pelo shell.
ctrl-alt-Delor

1
@richard Este é um ponto excelente. Truque divertido (no bash): touch -- -l; ls -?- você realmente recebe uma lista longa como se tivesse passado -lpara ls.
mattdm

@richard. Quando você não sabe se o comando aceita opções longas no estilo GNU ou pode suportar uma -hopção para outra coisa que não seja uma mensagem de ajuda, então '-?'(com as aspas) ou -:dê uma boa chance de receber uma mensagem de erro (e uso) desde :e ?não pode ser opções válidas para qualquer coisa usando getopt(3).
Stéphane Chazelas

@Stephane Chazelas. Se entendi seu comentário corretamente, você está escrevendo da perspectiva de um usuário de um programa, acho que essa pergunta é da perspectiva de alguém que está escrevendo um programa.
Ctrl-alt-delor

Respostas:


50

Ele deve ir para stdout, para que você possa digitar:

command --help | less

Isso também é recomendado pelas normas de codificação--help do Gnu .

Por outro lado, a mensagem de uso que você recebe ao usar uma opção inválida ou omitir um argumento necessário deve ir para o stderr, porque é uma mensagem de erro, e você não deseja que ela alimente o próximo comando em um pipeline.

Quando você usa --help, a mensagem de uso é a saída normal e esperada do comando. Portanto, ele vai para o stdout, para que possa ser canalizado para outro comando, como lessou grep.

Quando você diz command --bogus-option | other-command, não deseja que a mensagem de uso seja stdout, porque agora é uma saída inesperada que não deve ser processada other-command. Além disso, se a saída de --helpfor mais do que algumas linhas, a mensagem de erro de uso deve conter apenas um resumo da --helpsaída e consultar o usuário --helppara obter detalhes adicionais.


1
É um pouco confuso ter dois fluxos de saída diferentes para a mesma mensagem, dependendo de algo, não é?

7
Talvez, mas não sejam necessariamente a mesma mensagem. Se a saída de --helpmais de algumas linhas, a mensagem de uso produzida por uma opção inválida deve ser apenas um breve resumo dizendo para usar --helppara ver as informações completas.
Cjm 8/03

4
+1 - isso é 100% correto e não vejo espaço para desacordo aqui.
21711
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.