¿Debería el mensaje de uso ir a stderr o stdout?

29

Si el mensaje de uso se imprime con, por ejemplo,

 command -?

de un comando Unix ir a stderr o stdout, y por qué? ¿Debería ir al mismo lugar si el usuario comete un error con una opción?


fuente
44
Nota adicional: no use -? use --help y -h Porque --help y -h son estándar y porque -? La voluntad puede ser interpretada por el shell.
ctrl-alt-delor
1
@richard Este es un excelente punto. Truco divertido (en bash): en touch -- -l; ls -?realidad obtienes una lista larga como si hubieras pasado -la ls.
mattdm
@Ricardo. Cuando no sabe si el comando acepta opciones largas de estilo GNU o puede admitir una -hopción para otra cosa que no sea un mensaje de ayuda, entonces '-?'(con las comillas) o le -:da una buena oportunidad de recibir un mensaje de error (y uso) desde :y ?no pueden ser opciones válidas para nada usando getopt(3).
Stéphane Chazelas
@Stephane Chazelas. Si entiendo su comentario correctamente, está escribiendo desde la perspectiva de un usuario de un programa, esta pregunta creo que es desde la perspectiva de alguien que escribe un programa.
ctrl-alt-delor

Respuestas:

50

Debería ir a stdout, por lo que puede escribir:

command --help | less

Esto también es recomendado por los Estándares de Codificación Gnu en--help .

Por otro lado, el mensaje de uso que recibe cuando usa una opción no válida u omite un argumento requerido debe ir a stderr, porque es un mensaje de error y no desea que se alimente al siguiente comando en una tubería.

Cuando lo usa --help, el mensaje de uso es el resultado normal y esperado del comando. Por lo tanto, va a stdout, por lo que se puede canalizar a otro comando, como lesso grep.

Cuando dices command --bogus-option | other-command, no quieres que el mensaje de uso vaya a stdout, porque ahora es una salida inesperada que no debe ser procesada por other-command. Además, si la salida de --helpes más que un puñado de líneas, entonces el mensaje de error de uso solo debe contener un resumen de la --helpsalida y remitir al usuario --helppara obtener detalles adicionales.

cjm
fuente
1
Es un poco confuso tener dos flujos de salida diferentes para el mismo mensaje dependiendo de algo, ¿no?
77
Quizás, pero no son necesariamente el mismo mensaje. Si la salida de --helpes más que unas pocas líneas, entonces el mensaje de uso producido por una opción no válida debería ser solo un breve resumen que dice usar --helppara ver la información completa.
cjm
44
+1: esto es 100% correcto, y no veo lugar para desacuerdos aquí.
Simon