"&> foo"和"> foo 2>&1"之间有什么区别?

Max*_*tor 10 bash

似乎有两个bash惯用法将STDOUT和STDERR重定向到一个文件:

fooscript &> foo
Run Code Online (Sandbox Code Playgroud)

......而且......

fooscript > foo 2>&1
Run Code Online (Sandbox Code Playgroud)

有什么不同?在我看来,第一个只是第二个的快捷方式,但我的同事认为,即使初始重定向出错,第二个也不会产生输出,而第一个会将重定向错误吐出到STDOUT.

编辑:好的......似乎人们不理解我的要求,所以我会尽力澄清:

任何人都可以给我一个例子,上面写的两个特定的行行会产生不同的行为吗?

Bru*_*ine 8

bash手册:

重定向标准输出和标准错误有两种格式:

&>word
Run Code Online (Sandbox Code Playgroud)

>&word
Run Code Online (Sandbox Code Playgroud)

在这两种形式中,第一种是优选的.这在语义上等同于

 >word 2>&1
Run Code Online (Sandbox Code Playgroud)

"语义上等同"这一短语应该与您的同事解决问题.


Jou*_*nen 6

两行具有不同行为的情况是你的脚本没有在bash中运行,而是sh系列中的一些更简单的shell,例如dash(我认为在某些Linux发行版中它被用作/ bin/sh,因为它比庆典).在这种情况下,

fooscript &> foo
Run Code Online (Sandbox Code Playgroud)

被解释为两个命令:第一个命令在后台运行fooscript,第二个命令截断文件foo.命令

fooscript > foo 2>&1
Run Code Online (Sandbox Code Playgroud)

在前台运行fooscript并将其输出和标准错误重定向到文件foo.在bash中我认为这些行总是会做同样的事情.