默认情况下打开标准文件描述符 <=2。程序可以写入或读取超过 2 个的文件描述符,而无需使用open
系统调用来获取这样的描述符。然后程序可以在其手册中公布它正在使用什么文件描述符以及如何使用,并且 POSIX shell 可以打开一个文件并分配该文件描述符,使用exec
内置文件,然后调用将使用该文件的程序。
我想这样做的一个很好的理由是,如果程序想要有多个输出或输入文件,并且不想将它们指定为命令行参数(如果只有一个文件,你可以只重定向一个标准的文件描述符)。
我从未见过一个普遍可用的程序会在其手册中宣传这样的事情。这在实践中会发生吗?有人听说过这样的事情吗?
是的,我确实想留在 POSIX 世界中 - 所以没有 bash-only 内置插件。我只是想知道是否有这样的程序,而不是内置的shell。
当您使用<(...)
或使用进程替换时>(...)
,bash 将打开一个管道到任意高文件描述符上的另一个程序(我认为它曾经从 10 开始计数,但现在它从 63 开始计数)并将名称作为 /dev/ 传递fd/N 在第一个程序的命令行上。这不是 POSIX,但其他 shell 也支持它(这是 ksh88 功能)。
但这并不完全是您正在运行的程序的功能,它只是看到 /dev/fd/N 并尝试像普通文件一样打开它。
Autoconf 手册提到了一些历史性的注释:
一些古老的系统保留了一些文件描述符。按照惯例,当您登录到第 8 版(1985)到第 10 版 Unix(1989)时,文件描述符 3 被打开到 /dev/tty。文件描述符 4 在 Stardent/Kubota Titan(大约 1990 年)上有特殊用途,尽管我们现在不记得它是什么了。这两个系统都已过时,因此现在可以像对待任何其他文件描述符一样安全地对待文件描述符 3 和 4。
此外,当我为此进行谷歌搜索时,我发现了一个名为runit的程序,该程序将文件描述符 4 和 5 用于与日志轮换相关的某些目的。