Подтвердить что ты не робот

Cmd 2> & 1> log vs cmd> log 2> & 1

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

cmd > log 2>&1

и

cmd 2>&1 > log

где cmd - команда?

Что я должен предпочесть и почему?

4b9b3361

Ответ 1

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

Что это значит? Если вы скажете 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.

Wrong

cmd 2>&1 > log

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

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

Ответ 2

cmd > log 2>&1

Переадресовывает STDOUT для регистрации и замены STDERR с перенаправленным STDOUT.

cmd 2>&1 > log

Заменяет STDERR на STDOUT и затем перенаправляет исходный STDOUT в журнал.