Czy komunikat o użyciu powinien być przekazywany do stderr czy stdout?

29

Jeśli komunikat o użyciu wydrukowany jest np

 command -?

polecenia uniksowego przejdź do stderr lub stdout i dlaczego? Czy powinien on trafić w to samo miejsce, jeśli użytkownik pomyli się z opcją?


źródło
4
Uwaga dodatkowa: nie używać -? użyj --help i -h Ponieważ --help i -h są standardowe, a ponieważ -? będzie interpretowane przez powłokę.
ctrl-alt-delor
1
@richard To jest doskonały punkt. Zabawna sztuczka (w bash): touch -- -l; ls -?- faktycznie dostajesz długą listę, jakbyś przeszedł -ldo ls.
mattdm,
@richard. Jeśli nie wiesz, czy polecenie akceptuje długie opcje w stylu GNU, czy może obsługiwać -hopcję inną niż komunikat pomocy, to '-?'(z cudzysłowami) lub -:daj dobrą szansę na otrzymanie komunikatu o błędzie (i użyciu), ponieważ :i ?nie mogą być poprawnymi opcjami do niczego getopt(3).
Stéphane Chazelas
@Stephane Chazelas. Jeśli dobrze rozumiem twój komentarz, piszesz z perspektywy użytkownika programu, myślę, że to pytanie jest z perspektywy kogoś, kto pisze program.
ctrl-alt-delor

Odpowiedzi:

50

Powinien przejść na standardowe wyjście, więc możesz wpisać:

command --help | less

Jest to również zalecane przez normy kodowania Gnu na--help .

Z drugiej strony komunikat o użytkowaniu, który otrzymujesz, gdy użyjesz niepoprawnej opcji lub pominiesz wymagany argument, powinien przejść do stderr, ponieważ jest to komunikat o błędzie i nie chcesz, aby był podawany do następnego polecenia w potoku.

Podczas --helpużywania komunikat o użyciu jest normalnym i oczekiwanym wynikiem działania polecenia. Dlatego przechodzi do standardowego wyjścia, więc można go potokować do innego polecenia, takiego jak lesslub grep.

Kiedy mówisz command --bogus-option | other-command, nie chcesz, aby komunikat o użyciu został ustawiony na standardowe wyjście, ponieważ jest to nieoczekiwane wyjście, którego nie powinien przetwarzać other-command. Ponadto, jeśli wyjście --helpzawiera więcej niż garść wierszy, komunikat o błędzie użytkowania powinien zawierać tylko podsumowanie --helpwyniku i skierować użytkownika do --helpdodatkowych szczegółów.

cjm
źródło
1
To trochę mylące, mając dwa różne strumienie wyjściowe dla tej samej wiadomości w zależności od czegoś, prawda?
7
Być może, ale niekoniecznie jest to ta sama wiadomość. Jeśli wynik --helpjest większy niż kilka wierszy, komunikat o użyciu wygenerowany przez niepoprawną opcję powinien być tylko krótkim podsumowaniem z informacją, że należy użyć, --helpaby zobaczyć pełne informacje.
cjm
4
+1 - jest to w 100% poprawne i nie widzę tu miejsca na spory.
simon