Должно ли сообщение об использовании идти в stderr или stdout?

29

Если сообщение об использовании, которое напечатано, например, с

 command -?

команды Unix перейти на stderr или stdout, и почему? Должен ли он идти в то же место, если пользователь допустил ошибку с опцией?


источник
4
Дополнительное примечание: не использовать -? используйте --help и -h потому что --help и -h являются стандартными и потому что -? будет интерпретироваться оболочкой.
Ctrl-Alt-Delor
1
@ Richard Это отличный момент. Прикол (в bash): touch -- -l; ls -?- вы получите длинный список, как если бы вы перешли -lна ls.
Mattdm
@Ричард. Если вы не знаете, принимает ли команда длинные параметры в стиле GNU или может поддерживать -hпараметр, отличный от сообщения справки, тогда '-?'(с кавычками) или -:дайте вам хороший шанс получить сообщение об ошибке (и использовании), поскольку :и ?не может быть допустимыми параметрами для чего-либо, использующего getopt(3).
Стефан Шазелас
@ Стефан Чазелас. Если я правильно понимаю ваш комментарий, вы пишете с точки зрения пользователя программы, этот вопрос, я думаю, с точки зрения того, кто пишет программу.
Ctrl-Alt-Delor

Ответы:

50

Он должен перейти на стандартный вывод, поэтому вы можете ввести:

command --help | less

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

С другой стороны, сообщение об использовании, которое вы получаете, когда используете неверный параметр или пропускаете обязательный аргумент, должно идти в stderr, поскольку это сообщение об ошибке, и вы не хотите, чтобы оно передавалось следующей команде в конвейере.

Когда вы используете --help, сообщение об использовании является нормальным и ожидаемым выводом команды. Следовательно, он идет в стандартный вывод, поэтому его можно передать другой команде, например lessили grep.

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

CJM
источник
1
Немного запутанно иметь два разных потока вывода для одного и того же сообщения, в зависимости от чего-то, не так ли?
7
Возможно, но это не обязательно одно и то же сообщение. Если выходные данные --helpсодержат более нескольких строк, то сообщение об использовании, созданное недопустимым параметром, должно быть просто кратким сообщением, которое необходимо использовать --helpдля просмотра полной информации.
CJM
4
+1 - это на 100% правильно, и я не вижу здесь места для разногласий.
Симон