次の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
²少なくともこれは伝統的で一般的な方法です。シェルが動作を模倣できる場合は、フォークを最適化できます。バラより「サブシェル」と「サブプロセス」の正確な違いは何ですか?
答え2
サブシェル環境は別のプロセスに存在する必要はなく、現在の実行環境のみをコピーするだけです。これは呼び出しを行わないksh93
ことによって行われます。これにより、ksh93などの古代のプラットフォームでは、ksh93が非常に高速になり、分岐すると非常に遅くなります。virtual sub-shell
fork()
Win-DOS
Win-DOS
sh -c cmd
一方、デフォルトのシェルを使用すると、現在の対話型シェルと同じである必要がない新しいプロセスが作成されます。
sh
現在、シェルが同じであっても実行環境はコピーされず、作成されませんsub-shell
。