シェルが外部コマンド/プログラムを実行する場合、そのプログラムにはファイル記述子がありますか?

シェルが外部コマンド/プログラムを実行する場合、そのプログラムにはファイル記述子がありますか?

シェルのファイル記述子と、それらのファイル記述子をリダイレクトなどのために操作する方法については、多くの文書や議論があります。私の質問は、シェルコマンドが、、など
の外部プログラムである場合、それらのコマンドはシェルと同じようにファイル記述子を持っているのでしょうか? 具体的な例を挙げると、ターミナルプロンプトでこのコマンドを実行すると、rsynccatcurl

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

このヒアドキュメントの内容は STDIN に送られていると想定していますが、どのプロセスのものですか? シェルですか、それともcatファイル記述子を持っていて0、ヒアドキュメントの内容が直接に送られているのcatですfd0か?

答え1

まず、ファイルベース、インタラクティブ、またはその他の方法を問わず、すべての I/O にはそれぞれ固有のファイル記述子が必要であるということを述べます。

対話型ファイル記述子の標準化により、リダイレクトとパイプが可能になります。

シェルは標準の I/O 操作の専門家です。

この例では、は、catその STDIN が HEREDOC スクリプトを表すシェルの出力 ( を介して送信popen()) に設定され、その STDOUT が (popen() を使用して)phpの STDIN にパイプされて呼び出されます。 phpの出力はリダイレクトされないため、シェルの初期 STDOUT を指します。

関連情報