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

dog*_*ane 30 unix linux bash redirect command-line

有什么区别:

cmd > log 2>&1
Run Code Online (Sandbox Code Playgroud)

cmd 2>&1 > log
Run Code Online (Sandbox Code Playgroud)

cmd是命令吗?

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

Joh*_*ica 78

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

那是什么意思?如果你说2>&1那么你将stderr重定向到当前重定向到stdout的地方.如果stdout进入控制台,那么stderr也是.如果stdout要转到文件,那么stderr也是如此.如果按照这个增长然后重定向标准输出,标准错误仍然指向什么标准输出用来指向.它没有"跟随"stdout到新位置.

cmd > log 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

错误

cmd 2>&1 > log
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ChocoDeveloper如果你想追加,那么cmd >> log 2>&1.更多参考资料:http://www.tldp.org/LDP/abs/html/io-redirection.html&http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html (3认同)

Mar*_*gen 6

cmd > log 2>&1
Run Code Online (Sandbox Code Playgroud)

重定向STDOUT到日志,而不是STDERR重定向STDOUT.

cmd 2>&1 > log
Run Code Online (Sandbox Code Playgroud)

替换STDERRSTDOUT然后将原件 重定向STDOUT到日志.