отправка вывода в / dev / stderr против> & 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.
Cyrus
Связанный: unix.stackexchange.com/q/36403/38906
cuonglm
Я вижу, что мои правки снова введены & 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 вызывает несколько лишних предупреждений).

sourcejedi
источник