我其实有两个问题:
>&
在 shell 脚本中是什么意思/usr/bin/x_app >& /tmp/blog.txt
?难道不应该在后面加上一个数字&
来使其成为标准输出/错误吗?据我所知,这
>
是覆盖和>>
附加,所以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 重定向到相同的地址打开文件描述或相反亦然。
zsh
和bash
是两个 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 &> file
是cmd
和> file
并行运行的。zsh
还添加了对后者的支持&>
以兼容bash
.
您会在不同的 shell 中发现不同的语法。在rc
(80年代末)和衍生品(es
, )中,编写了akanga
Bourne 语法(并且它使得指定管道两端的 fd 变得更容易:(通过管道将 fd 3 of 连接到 fd 4 of ),这在 Bourne 语法中,你需要写)。2>&1
>[2=1]
cmd1 |[3=4] cmd2
cmd1
cmd2
{ 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 的功能,如别名、波形符扩展和大括号扩展。