Il messaggio di utilizzo dovrebbe andare su stderr o stdout?


29

Se il messaggio d'uso è stampato con es

 command -?

di un comando Unix vai su stderr o stdout, e perché? Dovrebbe andare nello stesso posto se l'utente commette un errore con un'opzione?


4
Nota aggiuntiva: non usare -? usa --help e -h Perché --help e -h sono standard e perché -? la volontà può essere interpretata dalla shell.
ctrl-alt-delor

1
@richard Questo è un punto eccellente. Trucco divertente (in bash): touch -- -l; ls -?- in realtà ottieni una lunga lista come se fossi passato -la ls.
Mattdm,

@Richard. Quando non sai se il comando accetta le opzioni lunghe in stile GNU o può supportare -hun'opzione diversa da un messaggio di aiuto, allora '-?'(con le virgolette) o -:ti dà una buona possibilità di ottenere un messaggio di errore (e utilizzo) dal :e ?non possono essere opzioni valide per qualsiasi utilizzo getopt(3).
Stéphane Chazelas,

@Stephane Chazelas. Se capisco correttamente il tuo commento, stai scrivendo dal punto di vista di un utente di un programma, questa domanda penso sia dal punto di vista di qualcuno che scrive un programma.
ctrl-alt-delor,

Risposte:


50

Dovrebbe andare su stdout, quindi puoi digitare:

command --help | less

Ciò è raccomandato anche dagli standard di codifica Gnu su--help .

D'altra parte, il messaggio di utilizzo che si ottiene quando si utilizza un'opzione non valida o si omette un argomento richiesto dovrebbe passare a stderr, perché è un messaggio di errore e non si desidera che venga inserito nel comando successivo in una pipeline.

Quando si utilizza --help, il messaggio di utilizzo è l'output normale e previsto del comando. Pertanto, passa a stdout, quindi può essere reindirizzato a un altro comando, come lesso grep.

Quando dici command --bogus-option | other-command, non vuoi che il messaggio d'uso vada a stdout, perché ora è un output imprevisto che non dovrebbe essere elaborato da other-command. Inoltre, se l'output di --helpè più di una manciata di righe, il messaggio di errore di utilizzo dovrebbe contenere solo un riepilogo --helpdell'output e fare riferimento all'utente --helpper ulteriori dettagli.


1
È un po 'confuso avere due flussi di output diversi per lo stesso messaggio a seconda di qualcosa, no?

7
Forse, ma non sono necessariamente lo stesso messaggio. Se l'output di --helpè più di poche righe, il messaggio di utilizzo prodotto da un'opzione non valida dovrebbe essere solo un breve sommario che dice di usare --helpper vedere le informazioni complete.
cjm

4
+1: questo è corretto al 100% e qui non vedo alcun disaccordo.
simon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.