cmd 2> & 1> log против cmd> log 2> & 1 - PullRequest
29 голосов
/ 15 января 2011

В чем разница между:

cmd > log 2>&1

и

cmd 2>&1 > log

, где cmd - это команда?

Что мне лучше и почему?

Ответы [ 2 ]

77 голосов
/ 17 января 2011

Заказ имеет значение.Способ рассуждать о перенаправлениях - читать их слева направо и понимать, что перенаправления направляют потоки в одно и то же место.Они не направляют потоки друг на друга.

Что это значит?Если вы говорите 2>&1, то вы перенаправляете stderr туда, куда в данный момент перенаправлен stdout.Если stdout идет на консоль, то и stderr тоже.Если stdout собирается в файл, то и stderr тоже.Если после этого вы перенаправите stdout, stderr по-прежнему будет указывать на то, на что stdout использовал для указания.Он не «следует» за stdout на новое место.

Right

cmd > log 2>&1

Это перенаправляет stdout на log, а затем перенаправляет stderr туда, куда сейчас перенаправляется stdout, а это log.

Конечный результат: и stdout, и stderr перенаправляются на log.

Неправильно

cmd 2>&1 > log

Это перенаправляет stderr куда угодноВ настоящее время перенаправляется стандартный вывод, который обычно является консолью.Затем стандартный вывод перенаправляется на log.Помните, что stderr не «следует» за stdout, поэтому он продолжает перенаправлять на консоль.

Конечный результат: stdout перенаправляется в файл журнала, и stderr (все еще) отправляется наприставка.Это почти наверняка не то, что вы хотите.

6 голосов
/ 15 января 2011
cmd > log 2>&1

Перенаправляет STDOUT в журнал и затем заменяет STDERR на перенаправленный STDOUT.

cmd 2>&1 > log

Заменяет STDERR на STDOUT, а затем перенаправляет оригинал STDOUT для входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...