Я знаю, что хорошо работающие утилиты, такие как grep, выводят «нормальные» сообщения в stdout и сообщения об ошибках в stderr.
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Когда я пишу сценарии оболочки самостоятельно, мне часто бывает трудно решить, какой вывод и какие сообщения я должен представлять на stderr, или мне вообще стоит беспокоиться.
Я хотел бы знать о передовой практике: когда перенаправление некоторого сообщения в stderr требуется и разумно, а когда нет?
«Это зависит», конечно, но есть ли у вас какие-то идеи, которые помогут мне принять эти решения?
Чтобы этот субъективный вопрос соответствовал формату, я хотел бы предложить ответы, которые касаются «почему» и основаны на опыте и, если возможно, подкреплены фактами.
Ответы:
Молчание - золото. Ничего не выводить, если все хорошо.
Самый простой способ отделить stderr от stdout: просто представьте, что все ваши выходные данные скриптов будут перенаправлены на другую команду через канал. В этом случае вы должны хранить все уведомления в stderr, так как такая неожиданная информация в stdout может нарушить последовательность каналов.
Также иногда в трубах, как этот:
вам нужно передать что-то из
command2
вывода пользователей. Самый простой способ без временных файлов - это stderr.источник
echo
некоторые переменные показывают, что было сделано, показывают прогресс). Я не решаюсь поставить все на stderr, так как эти сообщения журнала - это все, что скрипт когда-либо выведет. Я не уверен, как применить идею трубы в этих ситуациях.Я вообще пишу все, что относится к работе приложения
stderr
,stdout
зарезервировано для данных.Представьте себе приложение, как
cat
. Когда вы используете его для чтения ввода и передачи его другому приложению (через канал), вы не хотите, чтобы вывод был завален сообщениями о состоянии.Всё, что может быть интересно другому приложению или постпроцессору для моего приложения
stdout
, всё, что относится только к внутреннему интерфейсу моего приложенияstderr
.источник
Мое личное предпочтение - отправлять сообщения об ошибках, исключения
stderr
и информационные сообщенияstdout
. ИМО,stderr
для любых исключений и, следовательно, мое соглашение.источник