我正在努力理解 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
[ 然后它解释了第一种格式和第二种格式之间的细微差别,但让我们暂时把它放在一边,因为它对于这个问题并不重要。 ]
据我了解,这表示>&3
重定向stderr
和stdout
到一个名为 的文件,这与重定向(可能)到文件描述符3
有很大不同。stdout
stderr
3
有人可以解释一下我缺少什么吗?
答案1
实际上,正是您搁置的那部分最相关(来自GNU bash 文档):
3.6.4 重定向标准输出和标准错误
此结构允许将标准输出(文件描述符 1)和标准错误输出(文件描述符 2)重定向到名称为单词扩展的文件。
重定向标准输出和标准错误有两种格式:
&>word
和
>&word
在这两种形式中,优选第一种。这在语义上等价于
>word 2>&1
使用第二种形式时,单词可能不会扩展为数字或“-”。如果是这样,出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。
最后一点是最重要的一点,所以我将在这里重复一遍:
使用第二种形式时,单词可能不会扩展为数字或“-”。如果是这样,出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。
因此,如果word
扩展为数字 或-
,则会触发特殊规则。字符串扩展到自身,因此3
可以说是“扩展”,3
这意味着>&3
根据中描述的规则进行处理复制文件描述符部分:
重定向运算符
[n]<&word
用于复制输入文件描述符。如果 word 扩展为一位或多位数字,则 n 表示的文件描述符将成为该文件描述符的副本。如果 word 中的数字未指定打开以供输入的文件描述符,则会发生重定向错误。如果 word 的计算结果为“-”,则文件描述符 n 被关闭。如果未指定 n,则使用标准输入(文件描述符 0)。
运营商
[n]>&word
其用法与复制输出文件描述符类似。如果未指定 n,则使用标准输出(文件描述符 1)。如果 word 中的数字未指定为输出而打开的文件描述符,则会发生重定向错误。如果 word 的计算结果为“-”,则文件描述符 n 被关闭。作为一种特殊情况,如果省略 n,并且 word 不扩展为一个或多个数字或“-”,则标准输出和标准错误将按照前面的描述进行重定向。
这一切都是为了说明在具体的如果 后面>&
是数字,则假定该数字是文件描述符。据推测,这正是手册中明确指出优于&>word
同类产品的原因。>&word
&>word