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