Когда использовать перенаправление для stderr в сценариях оболочки

Команда

hostname --fqdn (or -f)

мог бы также сделать то, что Вы хотите или не с тех пор в моей системе, которую я получаю (none) когда я работаю domainname

15
11.08.2013, 21:27
3 ответа

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

Молчание - золото. Ничего не произведите, если все прекрасно.

Я хотел бы знать о хорошей практике: Когда перенаправляет некоторое сообщение к stderr, требовавшемуся и разумному, и если не?

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

Также иногда в каналах как этот:

command1 | while read line ; do command2 ; done | command3

Вы должны передать что-то от command2 к пользовательскому выводу. Самым легким путем без временных файлов является stderr.

12
27.01.2020, 19:50
  • 1
    Спасибо за "воображают канал" идеей. Иногда я имею, развертывают сценарии, которые действительно только "уведомляют" (echo некоторые переменные, покажите то, что было сделано, покажите прогресс). Я смущаюсь помещать все на stderr, так как эти сообщения входа являются всем сценарием, будет когда-либо производить. Я не уверен, как применить идею канала в этих ситуациях. –  glts 13.06.2013, 22:25
  • 2
    @glts всегда становятся измененными и улучшенными. В то время как сценарии, которые Вы упоминаете, не производят данных теперь, они могли бы позже, или Вы могли бы использовать их в качестве начальные точки для других сценариев, которые делают. Если Вы будете следовать конвенции то для начала, Вы получите намного меньше неожиданностей позже. OTOH, если Вы просто хотите сохранить вывод в файл, затем необходимо перенаправить stderr, таким образом, это - компромисс как все остальное. –  Joe 15.06.2013, 02:01
  • 3
    +1 Другой пересказ: удостоверьтесь, что stdout является всегда машиночитаемым, или по крайней мере содержит полезные текстовые данные в последовательном формате. –  tripleee 12.08.2013, 00:51

Я обычно пишу все, что касается работы приложения к stderr, stdout резервируется для данных.

Вообразите приложение как cat. При использовании его, чтобы считать вход и передать его другому приложению (через канал), Вы не хотите, чтобы вывод был замусорен сообщениями о состоянии.

Все, что могло бы быть интересно другому приложению или постпроцессору к моему приложению, идет в stdout, все, что только касается стажера моего приложения, идет в stderr.

2
27.01.2020, 19:50

Мое персональное предпочтение состоит в том, чтобы отправить сообщения об ошибках и исключения к stderr и информационные сообщения к stdout. IMO, stderr для любых исключений и следовательно, моя конвенция.

0
27.01.2020, 19:50

Теги

Похожие вопросы