2015-01-23 2 views
2

У меня есть вопрос для перенаправления. Я всегда использую anycommands > /dev/null 2>&1, когда мне не нужен какой-либо выход. Но я никогда не использовал anycommands 2> /dev/null >&2В чем разница между «>/dev/null 2> & 1" и "2>/dev/null> & 2"

Вопрос: Какой из них лучше всего ожидать от выходов? В чем разница между anycommands > /dev/null 2>&1 и anycommands 2> /dev/null >&2

ответ

2

дело № 1: (echo stdout;echo stderr>&2) >/dev/null 2>&1

  • стандартный вывод (1) заменяется дескриптором к /dev/null
  • STDERR (2) дескриптор копируется из &1, который в настоящее время является FD к /dev/null
  • результат: нет выхода на всех

случае # 2: (echo stdout;echo stderr>&2) 2>&1 >/dev/null

  • STDERR (2) дескриптора копируется из &1, который является Stdout по умолчанию
  • стандартный вывод (1) заменяется дескриптором к /dev/null
  • Результат: stderr пуст, stdout не показано, stderr на stdout

случай # 3: (echo stdout; echo stderr >&2) 2> /dev/null >&2

же, как и случай # 1, stderr и stdout перешедшие роли

+1

Это объясняет '2> & 1>/dev/null', но вопрос спрашивает о'>/dev/null 2> и 1' –

+1

Спасибо, но я хотел бы знать '(echo stdout; echo stderr> & 2) 2>/dev/null> & 2' о случае # 2 – AkihikoTakahashi

+0

AkihikoTakahashi: то же, что и в случае с # 1 –

-1

Если вы используете только BASH, используйте &> перенаправить как стандартный вывод и стандартный поток ошибок. Это самое компактное, безопасное и простое решение.

Что касается вашего вопроса, то первый один эквивалентно &> (он перенаправляет как стандартный вывод и стандартный поток ошибок /dev/null.

Второй соединяет STDERR к /dev/null и перенаправляет стандартный вывод в новый поток ошибок, так что эквивалентно, насколько выход обеспокоен. Так же порядок операций дескрипторов файлов восстанавливаются.

+1

'&>' небезопасно. Обычно сценарии оболочки вызываются неожиданным интерпретатором (например, shebang is '/ bin/sh' вместо'/bin/bash' и '/ bin/sh' - это нечто иное, чем bash) и' &> 'не переносится. Например, 'dash' будет запускать команду в фоновом режиме, что, возможно, правильное поведение в соответствии со стандартом. –

+0

@WilliamPursell: «Если вы используете BASH, ..." –

+0

К сожалению, когда скрипт вызывается неожиданным интерпретатором, вы не используете bash. –

1

Эффективен, два эквивалентен. cmd > /dev/null 2>&1 соединяет стандартный вывод команды в /dev/null, а затем соединяет STDERR и тот же файл. cmd 2>/dev/null >&2 подключается STDERR к /dev/null, и затем соединяет stdout с i т. Единственное различие заключается в том, что два потока связаны с /dev/null, который не имеет отношения к статусу команды при ее запуске. В обоих случаях оба потока перенаправляются в ведро бит.

+0

Они не эквивалентны, см. Ответ Золтана. –

+1

@ Аарон Я вижу ответ Золтана. Он говорит о' 2> & 1>/dev/null', который ведет себя иначе, чем '>/dev/null 2> & 1', и это не вопрос. –

+0

Вы правы. Я не могу отменить мой downvote, если вы не отредактируете свой вопрос :-( –