答案1
限制。
这些限制取决于操作系统,并且可能受到诸如ulimit
.
使用文件描述符进行编程。
小项目
使用约定。根据您的看法,这就是为什么 stdin、stdout 和 stderr 分别为 0、1 和 2。如果您决定您的程序套件使用文件描述符 9 将事件发送到某种发布/订阅服务器,那么您需要确保您的程序遵循此约定。这在实践中效果很好。
通过环境或参数传递信息。
GNU make 有一个--jobserver-auth=R,W
选项(R 和 W 是数字),它告诉您要使用哪些文件描述符工作服务器(现在它倾向于让您自己打开命名管道,而不是传入打开的文件描述符)
让 bash 为您选择。
如果你说
exec {fred}>/tmp/fred.out
echo hello >&$fred
然后 bash 会为你选择一个文件描述符并将该值放入 fred 中。然后它将扩展第二行中的变量以导致>&
重定向到该文件描述符。
答案2
最好是让 shell 决定
exec {somefd}<>myfile
exec {mysock}<>/dev/tcp/192.168.0.5/8888
echo somefd = $somefd
echo my socket file handle = $mysock
# to write to the socket
echo "howdy" >&$mysock
# to read a line back
IFS= read -u $mysock line
echo "$line"
# when done close file handles
exec {somefd}>&-
exec {mysock}>&-
unset somefd mysock
# happy coding