Le message d'utilisation doit-il être envoyé à stderr ou stdout?

29

Si le message d'utilisation qui est imprimé avec par exemple

 command -?

d'une commande Unix aller à stderr ou stdout, et pourquoi? Doit-il aller au même endroit si l'utilisateur fait une erreur avec une option?


la source
4
Remarque supplémentaire: ne pas utiliser -? utilisez --help et -h Parce que --help et -h sont standard et parce que -? will peut être interprété par le shell.
ctrl-alt-delor
1
@richard C'est un excellent point. Astuce amusante (en bash): touch -- -l; ls -?- vous obtenez en fait une longue liste comme si vous étiez passé -là ls.
mattdm
@Richard. Lorsque vous ne savez pas si la commande accepte les options longues de style GNU ou peut prendre en charge une -hoption pour autre chose qu'un message d'aide, alors '-?'(avec les guillemets) ou -:vous donne une bonne chance d'obtenir un message d'erreur (et d'utilisation) depuis :et ?ne peut pas être des options valides pour quoi que ce soit en utilisant getopt(3).
Stéphane Chazelas
@Stephane Chazelas. Si je comprends bien votre commentaire, vous écrivez du point de vue d'un utilisateur d'un programme, cette question, je pense, est du point de vue de quelqu'un qui écrit un programme.
ctrl-alt-delor

Réponses:

50

Il devrait aller à stdout, vous pouvez donc taper:

command --help | less

Ceci est également recommandé par les normes de codage Gnu sur--help .

D'un autre côté, le message d'utilisation que vous obtenez lorsque vous utilisez une option non valide ou omettez un argument requis doit aller à stderr, car il s'agit d'un message d'erreur et vous ne voulez pas qu'il alimente la commande suivante dans un pipeline.

Lorsque vous utilisez --help, le message d'utilisation est la sortie normale et attendue de la commande. Par conséquent, il passe à stdout, il peut donc être redirigé vers une autre commande, comme lessou grep.

Lorsque vous dites command --bogus-option | other-command, vous ne voulez pas que le message d'utilisation soit envoyé à stdout, car c'est maintenant une sortie inattendue qui ne doit pas être traitée par other-command. De plus, si la sortie de --helpest supérieure à une poignée de lignes, le message d'erreur d'utilisation ne doit contenir qu'un résumé de la --helpsortie et renvoyer l'utilisateur vers --helppour plus de détails.

cjm
la source
1
C'est un peu déroutant d'avoir deux flux de sortie différents pour le même message selon quelque chose n'est-ce pas?
7
Peut-être, mais ce n'est pas nécessairement le même message. Si la sortie de --helpest supérieure à quelques lignes, le message d'utilisation généré par une option non valide ne doit être qu'un bref résumé indiquant à utiliser --helppour afficher les informations complètes.
cjm
4
+1 - c'est 100% correct, et je ne vois pas de place pour le désaccord ici.
Simon