Ответ 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 отправляется на консоль. Это почти наверняка не то, что вы хотите.