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

时间:2011-01-15 13:21:51

标签: linux bash unix command-line redirect

有什么区别:

cmd > log 2>&1

cmd 2>&1 > log

其中cmd是命令?

我应该选择哪个?为什么?

2 个答案:

答案 0 :(得分:76)

订单很重要。推理重定向的方法是从左到右读取它们,并意识到重定向使得流指向同一个地方。它们不会使流相互指向。

这是什么意思?如果您说2>&1,那么您将stderr重定向到当前重定向到stdout的位置。如果stdout进入控制台,那么stderr也是。如果stdout要转到文件,那么stderr也是如此。如果你通过重定向stdout来跟进它,stderr仍然指向stdout used 指向的内容。它没有“跟随”标准输出到新位置。

cmd > log 2>&1

这会将stdout重定向到log,然后将stderr重定向到现在重定向stdout的位置,即log

最终结果: stdout和stderr都被重定向到log

错误

cmd 2>&1 > log

这会将stderr重定向到当前正在重定向stdout的位置,这通常是控制台。然后stdout被重定向到log。请记住,stderr没有“跟随”stdout,因此它会继续重定向到控制台。

最终结果:将stdout重定向到日志文件,并且(仍然)将stderr发送到控制台。这几乎肯定不是你想要的。

答案 1 :(得分:6)

cmd > log 2>&1

STDOUT重定向到日志,然后用重定向的STDERR替换STDOUT

cmd 2>&1 > log

STDERR替换STDOUT,然后将原始 STDOUT重定向到日志。