我实际上有2个问题:
像这样>&
的shell脚本是什么意思/usr/bin/x_app >& /tmp/blog.txt
?难道不应该有一个数字&
使它成为stdout / err东西吗?
据我所知,这>
是覆盖并>>
正在追加,因此2>&1
应仅将stdout替换为stderr,但相反,这意味着将stdout和stderr放在一起。我们为什么不使用>>
?我的意思是我知道“追加”也不意味着“将它们放在一起”,但是比“覆盖”更接近,对吗?
>& file
是csh运算符(从70年代后期开始),将stdout和stderr都重定向到file
。Bourne Shell(也是从70年代后期开始)的等效项是> file 2>&1
或2> file >&1
,即将fd 1重定向file
到相同的打开文件描述,然后fd 2重定向到相同的打开文件描述,反之亦然。
zsh
并bash
有两发炮弹(从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 &> file
是cmd
和> file
并行运行。zsh
还增加了对&>
后者的支持,以与兼容bash
。
您会在不同的shell中找到不同的语法。在rc
(80年代末)和衍生物(es
,akanga
),伯恩的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] 删除。
我来说两句