В скриптах ошибки обычно отправляются в файловый дескриптор 2 с помощью &2
, то есть:
echo "error" >&2
Иногда /dev/stderr
используется вместо:
echo "error" > /dev/stderr
Глядя /dev/stderr
, я вижу, что это только символическая ссылка /proc/self/fd/2
, которая, в свою очередь, является символической ссылкой /dev/pts/5
(на моем текущем терминале).
Кажется, немного сложнее. Есть ли какая-то логика за этим?
Является ли использование /dev/stderr
и &2
эквивалент?
Любое из них предпочтительнее другого?
portability
stderr
Мартин Вегтер
источник
источник
echo "error" >2
создает файл с именем2
и содержаниемerror
.>2
, или>&2
?Ответы:
Специальное устройство
/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
выход.В 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
».источник
Вы правы,
>&2
более прямолинейны и совершенно "идиоматичны". Они должны быть эквивалентны, поэтому нет особой причины для использования>/dev/stderr
. Кроме того, если кто-то читает, не знает, что они делают, один из них, вероятно, легче узнать, чем другой :-). Но в целом я бы предложил вам использовать>&2
./ dev / stderr может быть полезен, когда программы будут записывать ошибки в указанное имя файла, но не поддерживают stderr. Очевидно, это немного надумано; / dev / stdout гораздо полезнее. (Недавно я обнаружил, что
mysql_safe
скрипт-обертка не будет записывать ошибки на консоль; к сожалению, он также хочет изменить разрешения для файла журнала ошибок, поэтому использование / dev / stderr вызывает несколько лишних предупреждений).источник