限制。

限制。

章节3.6 重定向Bash 手册中说:

使用大于 9 的文件描述符的重定向应谨慎使用,因为它们可能与 shell 内部使用的文件描述符发生冲突。

然而,章2.7 重定向据我所知,POSIX 规范没有提到对数量的任何限制?

根据 shell,我应该注意哪些限制?我可以找出文件描述符编号是否已被 shell 内部使用并跳过它吗?我可以使用的最大文件描述符编号是多少?

答案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

相关内容