在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号。
换句话说:有时可能是10
或01
吗?
它可能在其他炮弹中吗?
答案 0 :(得分:3)
从不。
在引擎盖下,重定向将尝试dup现有或免费的文件描述符,然后如果初步重定向成功,shell应继续运行true
。
dup
应始终失败,这实际上意味着在任一方向上尝试重定向应该足以测试文件描述符是否打开。
(相反,来自开放描述符的dup
几乎总是会成功。当你的每个进程文件描述符限制通常为1024-4096时,它会失败,理论上你可以获得一个权限如果shell试图重置打开的标志会失败,但是破折号,bash和zsh似乎没有尝试这样做。当我实际上尝试写入一个欺骗性的只读文件描述符时,我只得到IO错误,而不是在重定向期间。 )