Коли використовувати стандартний потік помилок у додатку командного рядка?


9

Чи є вказівки, коли слід використовувати помилку під час написання програми командного рядка? На моє здивування, я нічого не знайшов, коли гуглив це.

Зокрема, питання, яким я зараз займаюся, - це використовувати stdoutчи stderrколи користувач викликав програму з незаконними аргументами. Однак більш вдячна відповідь дуже цінується, оскільки це, безумовно, не буде єдиним випадком, коли потрібно чітке правило, щоб написати програму, яка веде себе так, як очікується користувачем.


Чи добре, що ці повідомлення про помилки змішуються зі звичайним результатом? Наприклад, програма є фільтром для даних?
thrig

Це не фільтр для даних. Це також не інтерактивне. Користувач називає це аргументами (серед яких є файлові шляхи), програми працюють, змінює ці файли, друкує кілька повідомлень, в ідеалі не друкує жодних повідомлень про помилки та припиняється.
UTF-8

Відповіді:


15

Так, відображати повідомлення про те, stderrколи використовуються неправильні аргументи. І якщо це також спричиняє вихід програми, вийдіть із ненульовим статусом виходу.

Для діагностичних повідомлень слід використовувати стандартний потік помилок або для взаємодії з користувачем. До діагностичних повідомлень належать повідомлення про помилки, попередження та інші повідомлення, які не є частиною виводу утиліти, коли вона працює правильно ("правильно" означає, що нічого надзвичайного не відбувається, як-от файли не знайдені, або що б там не було).

У багатьох оболонках (все?) Відображається підказки, які типи користувачів та меню тощо надається, stderrщоб перенаправлення stdoutне завадило вам значну взаємодію з оболонкою.

Далі йде повідомлення з блогу на цю тему:

Це цитата Дуга Макіллроя, винахідника труб Unix, що пояснює, як це stderrсталося. 'v6' посилається на версію конкретної версії оригінальної операційної системи Unix, яка була випущена в 1975 році.

Усі програми розміщували діагностику на стандартному виході. Це завжди спричиняло проблеми, коли висновок перенаправляли на фільтр, але ставали нестерпними, коли вихід був спрямований на нічого не підозрілого процесу. Тим не менш, не бажаючи порушувати простоту моделі «стандарт-вхід-стандарт-вихід», люди допустили такий стан справ через v6. Незабаром після цього Денніс Річі вирізав Гордіїв вузол, ввівши стандартний помилку. Цього було недостатньо. За допомогою конвеєрної діагностики можна отримати будь-яку з декількох програм, що працюють одночасно. Діагностика необхідна для ідентифікації себе.
- Дуг МакІллрой, "Дослідницький читач UNIX: анотовані уривки з посібника програміста, 1971-1986"

"Ідентифікувати себе" означає просто сказати "Гей! Це я говорю! Це пішло не так: [...]":

$ ls nothere
ls: nothere: No such file or directory

Робити це на stderrкраще, так як в противному випадку можна було б читати все , що читав на stdout(але ми не будемо робити це з lsтак чи інакше , чи не так?).


Отже, коли ви запитуєте користувача про те, що програма працює, ви повинні надрукувати питання на stderr? Це не звучить правильно. У вас є джерело для цього? Чи це стосується лише програм, які мають інші результати, а не лише запитання та відповіді (вихід, який користувач може захотіти десь подати)?
UTF-8

@ UTF-8 Чи слід текст питання вважати частиною результатів програми? А як щодо того, що вводить користувач? Я не думаю, що має бути (як і снаряди, не думаю, що має бути). Але, можливо, це залежить від програми?
Kusalananda

1
Дякуємо за вашу редакцію Тим часом я перевірив поведінку стандартних додатків, і вони поводяться так, як можна було б очікувати, що вони поведуть себе, прочитавши вашу відповідь.
UTF-8

@ UTF-8 ви можете знайти відповіді на це питання: unix.stackexchange.com/q/331611/22222
terdon

6

З специфікацій POSIX для стандартних потоків:

При запуску програми три потоки мають бути заздалегідь визначені і не повинні відкриватися явно: стандартний вхід (для читання звичайного вводу), стандартний вихід (для запису звичайного виводу) та стандартна помилка (для запису діагностичного виводу ).

Іншими словами, підпадає помилка, інформація про налагодження та все, що підпадає під діагностичну категорію stderr.

Див. Пов’язане запитання для отримання додаткової інформації: Чи належать звіти про хід роботи / журнал реєстрації на stderr або stdout?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.