shell 命令中 >& 是什么意思?

shell 命令中 >& 是什么意思?

我其实有两个问题:

  1. >&在 shell 脚本中是什么意思/usr/bin/x_app >& /tmp/blog.txt?难道不应该在后面加上一个数字&来使其成为标准输出/错误吗?

  2. 据我所知,这>是覆盖和>>附加,所以2>&1应该用 stderr 替换 stdout,但相反,这意味着将 stdout 和 stderr 放在一起。我们为什么不使用>>?我的意思是我知道“追加”也不意味着“将它们放在一起”,但它比“覆盖”更接近它,​​对吗?

答案1

>& file是一个 csh 运算符(来自 70 年代末),用于将 stdout 和 stderr 重定向到file. Bourne shell(也是 70 年代末)的等效项是> file 2>&1, 或2> file >&1,即将 fd 1 重定向到file,然后将 fd 2 重定向到相同的地址打开文件描述或相反亦然。

zshbash是两个 shell(80 年代末、90 年代初),它们采用了 Korn1 shell(以及扩展的 Bourne shell)和 csh 的功能,并且除了Bourne/Korn 操作>&符之外还支持 csh 操作符。[i]>&j

但这两者是冲突的。

cmd >& "$var"

$var如果包含数字,则最终将执行 Bourne/Korn 重定向,否则将执行 csh 重定向。

实际上,最好cmd > "$var2" 2>&1在这些 shell 中避免使用 csh 运算符并使用 Bourne 语法 ( ) 以避免出现意外。

请注意,最初bash不支持 csh >&,但支持&>相同的功能。这也与 Bourne 语法相冲突。在 Bourne shell 中,cmd &> filecmd> file并行运行的。zsh还添加了对后者的支持&>以兼容bash.

您会在不同的 shell 中发现不同的语法。在rc(80年代末)和衍生品(es, )中,编写了akangaBourne 语法(并且它使得指定管道两端的 fd 变得更容易:(通过管道将 fd 3 of 连接到 fd 4 of ),这在 Bourne 语法中,你需要写)。2>&1>[2=1]cmd1 |[3=4] cmd2cmd1cmd2{ cmd1 3>&1 >&5 5>&- | 4<&0 <&6 6<&- cmd2; } 5>&1 6<&0

外壳fish(2000 年代中期)有不同的变化I/O 重定向语法 来自 Bourne shell 的。


1 Korn shell(80 年代初)基于 Bourne shell,但也借用了 csh 的功能,如别名、波形符扩展和大括号扩展。

相关内容