现有的fd是否总是可以作为输入和输出重复?

时间:2017-01-13 18:29:58

标签: bash shell zsh ksh file-descriptor

在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"

问题是:

对于&#34;免费&#34; "$rco$rci"的退出值与11不同的条件。 fd号。

换句话说:有时可能是1001吗?

它可能在其他炮弹中吗?

1 个答案:

答案 0 :(得分:3)

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

来自未打开的描述符的

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

(相反,来自开放描述符的dup几乎总是会成功。当你的每个进程文件描述符限制通常为1024-4096时,它会失败,理论上你可以获得一个权限如果shell试图重置打开的标志会失败,但是破折号,bash和zsh似乎没有尝试这样做。当我实际上尝试写入一个欺骗性的只读文件描述符时,我只得到IO错误,而不是在重定向期间。 )