次の2つの名前があります。サブシェルそしてサブシェル。
はい、子プロセスは次のいずれかの方法で始まります。
sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
すべて同じで名前は同じですか?誰もが同じ属性を持っていますか?
POSIXこのような定義があります。:
シェル実行環境には以下が含まれます。
しかし、上記のリンクの最後の段落はこんな感じです。
サブシェル環境はシェル環境のコピーとして作成する必要がありますが、無視されない信号トラップはデフォルトの動作に設定する必要があります。
特に:
コマンドの置換、括弧でグループ化されたコマンド、および非同期のリストは、サブシェル環境で実行する必要があります。さらに、マルチコマンドパイプラインの各コマンドはサブシェル環境にあります。
そこに含まれていないsh -c 'echo "Hello"'
ものもサブシェルと呼ぶべきですか?
ベストアンサー1
サブシェル重複既存のシェル。同じ変数、同じ機能、同じオプションなどがあります。後ろでは、次のようにサブシェルが作成されます。fork
$(…)
システムコール²;親プロセスが待機しているか(たとえば)、寿命を継続している間、子プロセスは予想されるタスクを続けるか(たとえば)、… &
予想されるタスク(たとえば… | …
)を実行します。
sh -c …
サブシェルは作成されません。別のプログラムが起動します。このプログラムはシェルですが、それは偶然の一致です。プログラムは他のシェルでもあります(たとえば、sh -c …
bashで実行していてsh
ダッシュの場合)。つまり、偶然にかなり似たように動作するまったく異なるプログラムかもしれません。後で外部コマンド(sh
または他のコマンド)を実行すると、fork
システムコールが呼び出されます。execve
システムコール変える子プロセスのシェルプログラムは他のプログラム(ここsh
)によって実行されます。
¹bashやmkshなどの一部のシェル関連変数は含まれますが、除外されます。$$
BASHPID
²少なくともこれは伝統的で一般的な方法です。シェルが動作を模倣できる場合は、フォークを最適化できます。バラより「サブシェル」と「サブプロセス」の正確な違いは何ですか?