我正在努力理解 bash 中的 IO 重定向。我见过很多像下面这样的例子(从字面上取自这里接受的答案):
exec 3<> /tmp/foo #open fd 3.
echo "test" >&3
exec 3>&- #close fd 3.
第二行没看懂 准确地说,我不明白它的行为如何符合 bash 手册。
显然,在第二行中,>&3
应该重定向stdout
(可能stderr
——我不知道)到文件描述符 3;其他一切都没有任何意义。
但是从当前的 bash 手册(在撰写本文时),第 3.6.4 节(格式化我的):
此构造允许将标准输出(文件描述符 1)和标准错误输出(文件描述符 2)重定向到名称为 word 扩展的文件。 重定向标准输出和标准错误有两种格式:
&>word
和>&word
[ 然后它解释了第一种格式和第二种格式之间的细微差别,但让我们暂时搁置一下,因为它对问题并不重要。]
据我了解,这表示>&3
重定向stderr
andstdout
到名称为 的文件3
,这与重定向stdout
(并且可能stderr
)到文件描述符完全不同3
。
有人能解释一下我错过了什么吗?
实际上,恰恰是您搁置的最相关的部分(来自GNU bash 文档):
最后一点是最重要的一点,所以我会在这里重复一遍:
因此,如果
word
扩展为数字 或-
,则会触发特殊规则。字符串扩展到自身,因此3
可以说是“扩展”到3
这意味着>&3
根据复制文件描述符部分中描述的规则进行处理:所有这一切都表明,在特定情况下,后面
>&
是一个数字,该数字被假定为文件描述符。据推测,这正是为什么手册明确指出&>word
优先于等效项的>&word
原因&>word
。