![シェルが外部コマンド/プログラムを実行する場合、そのプログラムにはファイル記述子がありますか?](https://rvso.com/image/88791/%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%8C%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E3%81%9D%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E3%81%AF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%A8%98%E8%BF%B0%E5%AD%90%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
シェルのファイル記述子と、それらのファイル記述子をリダイレクトなどのために操作する方法については、多くの文書や議論があります。私の質問は、シェルコマンドが、、など
の外部プログラムである場合、それらのコマンドはシェルと同じようにファイル記述子を持っているのでしょうか? 具体的な例を挙げると、ターミナルプロンプトでこのコマンドを実行すると、rsync
cat
curl
% 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 を指します。