Что считается «идеальным» в отношении использования stdout / stderr для вывода в разных ситуациях?

Я видел stdout и stderr использовались различными способами – насколько я понимаю, обычно используется stdout для общей информации и stderr для ошибок и т. П. Тем не менее, я также видел, что stderr используется для вывода информационных сообщений, связанных с самой программой (но не связанных с ошибками, предупреждениями, отладкой и т. Д.) И для целей отладки (я предполагаю, что последний использует поток ошибок, чтобы его можно было отфильтровать до вспомогательная отладка) и stdout для более серьезных предупреждений, которые, как я думал, принадлежали бы stderr .

Итак, мне было интересно – когда он считается идеальным для использования stdout или stderr в отношении того, что выводит программа, помимо общего вывода и ошибок? Является ли она более зависимой от программы или более общей?

3 Solutions collect form web for “Что считается «идеальным» в отношении использования stdout / stderr для вывода в разных ситуациях?”

Причина того, что разделение stdout и stderr в первую очередь заключается в том, чтобы различать вывод программных данных (которые могут быть сохранены в файле, поданы в конвейер и т. Д.) И диагностики и пуха (которые действительно представляют интерес для человека оператор смотрит на терминал). (Нет автоматического способа сделать то же самое для ввода, но вы можете сделать это с небольшими проблемами, открыв и прочитав управляющее терминальное устройство, а не stdin .) Таким образом, если у вас есть выбор между написанием чего-то на stdout или stderr , лучшая эвристика, вероятно, «будут ли эти данные интересны для другой программы, используя мой вывод?» Однако это может быть зависящим от программ и приложений, и поэтому нет ни одного правила переопределения. (Вот почему есть опции переопределения, такие как 2>&1 и т. Д. В bash .)

Это зависит! Одним из важных факторов является то, что stderr не загружается по умолчанию, так как не хотелось бы потерять сообщение об ошибке для буферизации, когда что-то не удается, в то время как stdout – это строка (терминал) или блок (в противном случае), буферизованный по умолчанию. Это более эффективно, хотя сбои могут привести к потере данных в строках или блоках. Другое – это то, что выводит программа; если что-то испускает какой-либо конкретный формат, скажем, CSV или JSON, смешивая сообщения об ошибках, которые могут повредить его (или требуют кодирования в определенном формате, а затем что произойдет, если есть ошибка, кодирующая его в этом формате abort! abort! abort! ), в то время как в других случаях (система интерактивного типа меню?) сообщения об ошибках смешивания с другим выходом могут не иметь значения.

Всегда думайте, что кто-то поставит вашу программу в какой-то момент:

 $ inputProducer | yourProgram | outputConsumer 

Рассматривая вопрос о том, следует ли направлять что-то в stderr или stdout , важно то, имеет ли это что-то для (generic) outputConsumer или это только усложнит жизнь.

  • Релевантно: stdout
  • Неприемлемо: stderr

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

  • Как фильтровать stdout программы через grep, все еще контролируя программу?
  • Как заставить программы python вести себя как соответствующие инструменты unix?
  • `docker logs foo | less` не доступен для поиска или прокрутки, но `docker logs foo 2> & 1 | меньше` является
  • используя stdout дважды (но не tee, как я знаю)
  • Оператор вывода вывода в python не входит в журнал cron
  • Добавление кода выхода в файл журнала
  • Текст заменяет буквально * все * экземпляры строки через stdin, stdout
  • Как я могу захватить stdout / stderr в файле, но все еще вижу его в моей консоли?
  • Могу ли я читать и писать в тот же файл в Linux, не перезаписывая его?
  • Почему опция -v с rm показывает записи с обратным отсчетом и обычной цитатой?
  • Чтение данных из канала в течение определенного времени (в секундах)
  • Interesting Posts

    Какова наилучшая практика добавления дисков в LVM

    Как сортировать музыку в Rhythmbox?

    Пароль root не работает для входа в Gnome с помощью gdm

    Не удается установить параметр «-o remount» на общем ресурсе NFS для работы в Slackware 13.1

    awk, как изменить значение файла с помощью наборов параметров?

    Подключите USB-накопитель без разделов с помощью правил udev

    Как скопировать установленное приложение на другой компьютер, на котором отсутствуют инструменты сборки?

    Udev запускает сценарий спящего режима

    Как предоставить Root привилегии для пользователя в Centos 6.2 минимальный

    Неинтерактивно сменить пользователя в bash

    Проблемы с наушниками Lenovo ThinkPad (комбинированный разъем)

    Включение python3 в vim в Fedora 24

    Найти отличия в файле и сортировке файла по ключу

    Bash Scripting: автоматизировать команду в консоли

    Предварительно заполнить предыдущее имя пользователя на экране входа в KDE

    Linux и Unix - лучшая ОС в мире.