Чи повинно повідомлення про використання переходити до stderr або stdout?


29

Якщо повідомлення про використання, яке друкується, наприклад,

 command -?

команди Unix перейти до stderr або stdout, і чому? Чи повинен він перейти на те саме місце, якщо користувач помилився з опцією?


4
Додаткова примітка: не використовувати -? використання --help і -h Тому що --help і -h є стандартними і тому що -? воля може бути інтерпретована оболонкою.
ctrl-alt-delor

1
@richard Це відмінний момент. Веселий трюк (у баші): touch -- -l; ls -?- ви насправді отримуєте довгий список, як ніби перейшли -lдо ls.
mattdm

@richard. Якщо ви не знаєте, чи приймає команда довгі параметри у стилі GNU чи може підтримувати -hваріант, який не відрізняється від довідкового повідомлення, тоді '-?'(з цитатами) або -:ви дасте хороший шанс отримати повідомлення про помилку (та використання), оскільки :і ?не може бути дійсними опціями для нічого, що використовує getopt(3).
Стефан Шазелас

@Stephane Chazelas. Якщо я правильно розумію ваш коментар, ви пишете з точки зору користувача програми, це питання, я думаю, з точки зору того, хто пише програму.
ctrl-alt-delor

Відповіді:


50

Він повинен переходити до stdout, тому ви можете вводити:

command --help | less

Це також рекомендовано стандартами кодування Gnu на--help .

З іншого боку, повідомлення про використання, яке ви отримуєте, коли використовуєте недійсний параметр або опускаєте необхідний аргумент, повинно перейти до stderr, оскільки це повідомлення про помилку, і ви не хочете, щоб воно переходило до наступної команди в конвеєрі.

Під --helpчас використання повідомлення про використання - це нормальний і очікуваний вихід команди. Тому він переходить до stdout, тому його можна перенести на іншу команду, наприклад, lessабо grep.

Коли ви говорите command --bogus-option | other-command, ви не хочете, щоб повідомлення про використання переходило до stdout, оскільки тепер це несподіваний вихід, який не повинен оброблятися other-command. Крім того, якщо вихідний показник --helpскладає більше ніж кілька рядків, повідомлення про помилку використання повинно містити лише короткий виклад --helpрезультату та звертатися до користувача для --helpотримання додаткової інформації.


1
Трохи заплутано мати два різних вихідних потоку для одного і того ж повідомлення залежно від чогось, чи не так?

7
Можливо, але вони не обов'язково однакові. Якщо вихідний показник --helpстановить більше декількох рядків, то повідомлення про використання, створене недійсною опцією, повинно бути лише коротким підсумком, який повинен використовуватись --helpдля перегляду повної інформації.
cjm

4
+1 - це на 100% правильно, і я не бачу тут місця для розбіжностей.
simon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.