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

亨利

我实际上有2个问题:

  1. 像这样>&的shell脚本是什么意思/usr/bin/x_app >& /tmp/blog.txt难道不应该有一个数字&使它成为stdout / err东西吗?

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

斯蒂芬·查泽拉斯(Stephane Chazelas)

>& file是csh运算符(从70年代后期开始),将stdout和stderr都重定向到fileBourne Shell(也是从70年代后期开始)的等效项是> file 2>&12> file >&1,即将fd 1重定向file到相同的打开文件描述,然后fd 2重定向到相同的打开文件描述,反之亦然。

zshbash有两发炮弹(从80年代末,90年代初),其功能了来自两个Korn¹壳(通过扩展的是Bourne shell)和csh和支持,>&除了CSH操作[i]>&j伯恩/科恩操作。

但这两个冲突。

cmd >& "$var"

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

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

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

您会在不同的shell中找到不同的语法。rc(80年代末)和衍生物(esakanga),伯恩的2>&1写入>[2=1](它可以更容易地指定哪些FDS是为在管子的每一端:cmd1 |[3=4] cmd2(FD连接3cmd1至FD 4的cmd2通过配管),其在伯恩语法,则需要编写{ cmd1 3>&1 >&5 5>&- | 4<&0 <&6 6<&- cmd2; } 5>&1 6<&0)。

fish外壳(21世纪中期)中有不同的变化I / O重定向语法从Bourne shell中的。


¹Korn shell(从80年代初开始)基于Bourne shell,但还借鉴了csh的功能,例如别名,波浪号扩展和大括号扩展。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章