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?


fonte
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.

cjm
fonte
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