Должен ли я выводить предупреждения в STDERR или STDOUT? - PullRequest
26 голосов
/ 16 сентября 2009

Я делаю скрипт, который обрабатывает предопределенный набор данных, выводя в файл. Я хочу, чтобы появилось предупреждение, когда один элемент данных (который всегда является «регулярным» в каждом наборе, к которому у меня был доступ) отличается тем, что это значение не обрабатывается (поскольку я не знаю, как оно влияет на данные). Должен ли я вывести это предупреждение на stderr или stdout?

Ответы [ 3 ]

29 голосов
/ 16 сентября 2009

Если я сохраню выходные данные этого сценария (т.е. только stdout), чтобы потом обработать их, будет ли это предупреждение мешать анализу выходных данных? Более того, если выходные данные передаются другому процессу, предупреждение должно появиться на терминале, поэтому пользователь сразу увидит его.

По этим причинам, как правило, вы выводите предупреждения в stderr.

6 голосов
/ 16 сентября 2009

Предупреждение должно идти в stderr.

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

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

your_script | downstream_process

Если пользователь хочет, чтобы предупреждение от stderr перешло в последующий процесс, который будет анализировать stdout и stderr, пользователь может использовать 2> & 1 для перенаправления stderr в stdout.

your_script 2>&1 | downstream_process

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

1 голос
/ 16 сентября 2009

Реальный вопрос заключается в следующем: если бы кто-то перенаправил вывод вашего скрипта в файл, вы бы хотели, чтобы предупреждение было помещено в файл или направлено пользователю?

Если вы ожидаете, что пользователь предпримет какое-либо действие в результате предупреждения, он должен перейти к STDERR. Если какой-либо нижестоящий скрипт может быть сработал из-за предупреждения, он должен перейти к STDERR.

...