シェルのファイル記述子やリダイレクトなどのために、そのファイル記述子を操作する方法に関する多くのドキュメントやディスカッションがあります。
私の質問は、シェルコマンドがなどの外部プログラムである場合、rsync
これらのcat
コマンドcurl
はシェルと同じファイル記述子を持っていますか?
具体的な例を挙げると、端末プロンプトでこのコマンドを実行すると
% cat << EOF | php
<?php
echo "hello". PHP_EOL;
echo "another line" . PHP_EOL;
EOF
私はこのheredocの内容がSTDINに入力されたと仮定します。しかし、どのようなプロセスですか?またはcat
ファイル記述子があり、0
heredocの内容cat
がのfd0
?
答え1
最初に言うべきことは、ファイルベースであってもインタラクティブであれ、他の方法であれ、すべてのI / Oに固有のファイル記述子が必要であるということです。
対話型ファイル記述子の標準化により、リダイレクトとパイプが可能です。
シェルは標準I/O操作の専門家です。
あなたの例では、cat
HEREDOCスクリプトのシェル出力を示すためにSTDINが設定された状態でスクリプトが呼び出され(転送を通じて)、そのSTDOUTがSTDIN popen()
にパイプされます(popen()を使用)。出力はリダイレクトされず、シェルの初期STDOUTを指します。php
php