有什么区别:
cmd > log 2>&1
和
cmd 2>&1 > log
其中cmd是命令?
我应该选择哪个?为什么?
答案 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
重定向到日志。