当 shell 执行外部命令/程序时 - 该程序是否有文件描述符?

当 shell 执行外部命令/程序时 - 该程序是否有文件描述符?

有很多关于 shell 的文件描述符以及如何操作这些文件描述符以进行重定向等的文档和讨论。
我的问题是,当 shell 命令是外部程序时,例如rsynccatcurl,这些命令是否有文件描述符和外壳一样吗?
举一个具体的例子,如果我在终端提示符下运行这个命令

% cat << EOF | php
<?php
echo "hello". PHP_EOL;
echo "another line" . PHP_EOL;
EOF

我假设这个heredoc的内容被输入到STDIN,但是是哪个过程呢? shell,或者是否cat有一个文件描述符0并且heredoc的内容被直接提供给cat's fd0

答案1

首先我们要说的是,所有 I/O 无论是基于文件、交互式还是任何其他方式都需要唯一的文件描述符。

交互式文件描述符的标准化允许重定向和管道。

shell 是标准 I/O 操作的专家。

在您的示例中,cat被调用,其 STDIN 设置为代表 HEREDOC 脚本的 shell 输出(通过 发送popen()),并将其 STDOUT 通过管道(使用 popen())连接到php的 STDIN。 php的输出没有被重定向,指向 shell 的初始 STDOUT。

相关内容