відправлення виводу в / dev / stderr vs.> & 2


11

У сценаріях помилки зазвичай надсилаються до дескриптора файлів 2 &2, тобто:

echo "error" >&2

Іноді /dev/stderrвикористовується замість цього:

echo "error" > /dev/stderr 

Дивлячись /dev/stderr, я бачу, що це лише симпосилання на /proc/self/fd/2, що, в свою чергу, є симпосиланнями на /dev/pts/5(на моєму поточному терміналі).

Здається трохи складніше. Чи є за цим якась логіка?

Використовується /dev/stderrта &2еквівалентно?

Хтось із них віддає перевагу іншим?


3
echo "error" >2створює файл з ім'ям 2та вмістом error.
Сайрус


Я бачу, що моє редагування було введено наново & 2 замість 2. Чи справді ваше запитання щодо використання >2, чи >&2?
Джефф Шаллер

Відповіді:


13

Спеціальний пристрій /dev/stderrє системним, тоді як дескриптор файлу 2(не спеціальний пристрій /proc/self/fd/2) є портативним. Якщо ви хочете написати не портативний код, ці спеціальні пристрої - це гарне місце для запуску.

Є кілька систем з /dev/stderr: Linux, звичайно, і OSX . Але в OSX немає /procфайлової системи, і /dev/stderrце посилання на /dev/fd/2.

Подальше читання:


Також є випадок, коли хтось хоче це зробити, наприклад. це 2> bla.logможе працювати до тих пір, поки ви не працюєте з 2не жорстким кодом /dev/stderr. В основному 2не потрібно бути stderrрезультатом.
лайки

6

У bash та інших оболонках спосіб перенаправити щось на стандартну помилку - це використовувати >&2. Bash відкривається /dev/stderrяк дескриптор файлу 2 . Дескриптори файлів посилаються на те, &Nде Nномер дескриптора. Отже, echo error >&2буде надруковано errorдо стандартної помилки, до /dev/stderr.

Він також відкриється /dev/stdoutяк дескриптор файлів 1. Це означає, що ти можеш зробити echo output >&1. Однак, оскільки за замовчуванням все друкується на стандартний вихід, це те саме, що і саме echo outputпо собі.

Зараз, 2>інакше. Тут ви переспрямовуєте вихід помилок команди десь в іншому місці. Отже, 2>fileозначає "переспрямовувати все, що надруковано, на файл дескриптора 2 (стандартна помилка) на file".


3

Ви маєте рацію, >&2є більш прямим і ідеально "ідіоматичним". Вони повинні бути рівнозначними, тому немає особливих причин використовувати >/dev/stderr. За винятком того, що хтось, хто читає, не знає, що вони роблять, одного з них, мабуть, простіше дізнатись, ніж іншого :-). Але загалом я б запропонував вам скористатися >&2.

/ dev / stderr може бути корисним, коли програми записують помилки у вказане ім'я файлу, але не підтримують stderr. Очевидно, що це трохи надумано; / dev / stdout набагато корисніше. (Нещодавно я виявив, що mysql_safeскрипт обгортки не запише помилки на консоль; на жаль, він також хоче змінити дозволи на файл журналу помилок, тому використання / dev / stderr викликає кілька зайвих попереджень).

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