为什么 Bash 不接受 `&>&3`,即将 stdout 和 stderr 重定向到文件描述符 3?

为什么 Bash 不接受 `&>&3`,即将 stdout 和 stderr 重定向到文件描述符 3?

foobar给出它的序言、功能和调用:

exec 3>/dev/null    
function foobar { echo foo; echo bar >&2; }
foobar >/dev/null
foobar 2>/dev/null
foobar &>/dev/null
foobar &>&3

为什么 Bash 不执行最后一个简单命令?相反,Bash 退出时:

-bash: syntax error near unexpected token `&'

答案1

那是因为没有运算符&>&

有一个运算符&> word将 stdout 和 stderr 重定向到word.

有一个运算符可以从 fd[n]>& word复制 fd n(默认) 。作为一种特殊情况,如果为空且不是数字,则将 stdout 和 stderr 重定向到.1wordnwordword

但仅此而已。文件描述符没有可以与运算符组合的特殊语法。只有运算符,它们可以将其操作数解释为文件描述符或文件名。并且没有一个&>&运算符可以同时重定向 stdout 和 stderr,并将其正确的操作数解释为文件描述符。

&n摘要:文件描述符没有特殊的语法。属于&运算符,而不属于操作数。没有操作员&>&

答案2

为什么会这样呢? “... &>file” 只是“... >file 2>&1” 的语法糖。而已。如果要使描述符 2 指向 3 所指向的位置 (/dev/null),则需要使用“... 2>&3”。

相关内容