シェルが外部コマンド/プログラムを実行するとき - プログラムにファイル記述子がありますか?

シェルが外部コマンド/プログラムを実行するとき - プログラムにファイル記述子がありますか?

シェルのファイル記述子やリダイレクトなどのために、そのファイル記述子を操作する方法に関する多くのドキュメントやディスカッションがあります。
私の質問は、シェルコマンドがなどの外部プログラムである場合、rsyncこれらのcatコマンドcurlはシェルと同じファイル記述子を持っていますか?
具体的な例を挙げると、端末プロンプトでこのコマンドを実行すると

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

私はこのheredocの内容がSTDINに入力されたと仮定します。しかし、どのようなプロセスですか?またはcatファイル記述子があり、0heredocの内容catがのfd0

ベストアンサー1

最初に言うべきことは、ファイルベースであってもインタラクティブであれ、他の方法であれ、すべてのI / Oに固有のファイル記述子が必要であるということです。

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

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

あなたの例では、catHEREDOCスクリプトのシェル出力を示すためにSTDINが設定された状態でスクリプトが呼び出され(転送を通じて)、そのSTDOUTがSTDIN popen()にパイプされます(popen()を使用)。出力はリダイレクトされず、シェルの初期STDOUTを指します。phpphp

おすすめ記事