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