现有的 fd 是否总是被复制为输入和输出?

Could an existing fd always be duplicated both as input and output?

在 bash 中,一旦 fd 被使用(作为输入或输出):

exec 7>AFile

似乎 fd 号可以重复,既可以作为输入也可以作为输出:

true <&7; echo $?
true >&7; echo $?

可以针对变量重复测试:

fd=7
rco="$(true >&${fd} 2>/dev/null; echo $?)"
rci="$(true <&${fd} 2>/dev/null; echo $?)"

两个退出值合并为一个词:

[[ "$rco$rci" = "11" ]] && echo "The fd number $fd is free"

问题是:

在什么条件下 "$rco$rci" 的退出值将不同于 11 对于 "free" fd 号码。

换句话说:有时会是 1001 吗?

是否可以在其他 shell 中?

从来没有。 在引擎盖下,重定向将尝试 dup 现有或免费的文件描述符,然后 shell 应该继续 运行 true 如果初步重定向成功。

dup从未打开的描述符应该总是失败,这实际上意味着在任一方向尝试重定向应该足以测试文件描述符是否打开。

( 相反,dup 从打开的描述符中获取几乎总是成功。当你 运行 超出你的 per-process 文件描述符限制时它会失败,通常是 1024-4096 , 如果 shell 试图重置打开的标志,理论上你可以获得权限失败,但是破折号、bash 和 zsh 似乎没有尝试这样做。我只在以下情况下出现 IO 错误我实际上尝试写入一个被欺骗的只读文件描述符,而不是在重定向期间。)