Заказ имеет значение.Способ рассуждать о перенаправлениях - читать их слева направо и понимать, что перенаправления направляют потоки в одно и то же место.Они не направляют потоки друг на друга.
Что это значит?Если вы говорите 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 (все еще) отправляется наприставка.Это почти наверняка не то, что вы хотите.