サブシェルは子シェルと同じです


11

この2つの名前がありますサブシェル子シェルです。

はい、子プロセスは次のいずれかによって開始されます:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

すべて同等で、同じ名前を共有していますか?すべて同じプロパティを共有していますか?


POSIXには次の定義があります

シェル実行環境は...で構成されています。

しかし、上記のリンクの最後の段落にはこれがあります:

サブシェル環境は、無視されないシグナルトラップがデフォルトのアクションに設定されることを除いて、シェル環境の複製として作成されます。

そして特に:

コマンド置換、括弧でグループ化されたコマンド、および非同期リストは、サブシェル環境で実行されます。さらに、マルチコマンドパイプラインの各コマンドはサブシェル環境にあります。....

sh -c 'echo "Hello"'そこに含まれていない、それもサブシェルと呼ばれるべき?

回答:


14

サブシェルは既存のシェルを複製します。同じ変数fork¹ 、同じ関数、同じオプションなどがあります。内部では、システムコール²を使用してサブシェルが作成されます。子プロセスは、親が待機している間(例:)、$(…)その存続を続行するとき(例:)、… &またはそれ以外の場合は期待されること(例:)を実行している間に、期待されることを実行し… | …ます。

sh -c …サブシェルを作成しません。別のプログラムを起動します。そのプログラムはたまたまシェルですが、それは単なる偶然です。プログラムは、別のシェル(たとえば、sh -c …bashから実行し、shダッシュの場合)、つまり、動作にかなりの類似点があるような完全に異なるプログラムの場合もあります。内部的には、外部コマンド(shまたはその他のコマンド)を起動するforkとシステムコールが呼び出され、次にexecveシステムコールが呼び出されてサブプロセス内のシェルプログラムが別のプログラム(ここでは)に置き換えられshます。

cludingを含み$$ますが、bashやmkshなどのシェル固有の変数をいくつか含みBASHPIDます。
² 少なくとも、これは従来の通常の実装です。シェルは、振る舞いを模倣できればフォークを最適化できます。

関連するmanページ:fork(2)execve(2)


ありがとう。bash shebangでbashスクリプトを実行するのは何ですか?
ティム

@Timと同じことsh -c:偶然にもシェルであるサブプロセスです。
Gilles「SO-邪悪なことをやめなさい」

(1)「外部コマンド(shまたはその他)を起動すると、forkシステムコールが呼び出され、次にexecveシステムコールがサブプロセスのシェルプログラムを別のプログラム(ここではsh)に置き換えます。」フォークが最初にサブシェルを作成し、次にexecveがサブシェルを外部プログラムに置き換えるのは正しいことですか?返信の2つのケースでは、サブシェルが常に作成されますか?(2)「既存のシェルを複製するサブシェル。」どういう意味ですか?
ティム

(3)ではbash -c <command>、シェルをforkしてからexecveを実行するbash -c <command>と、bashシェルが作成されます。次に、システムコールを使用し<command>てbashシェルをフォークしてexecveを再度実行し<command>ますか?
ティム

2
@cuonglm「子シェル」は、「サブシェル」とは異なり、特定の意味を持つ専門用語ではありません。それが子であるシェルであれば、通常の英語の規則に従って、子シェルです。
Gilles「SO-悪をやめなさい」

1

サブシェル環境は、別のプロセスに存在する必要はありません。現在の実行環境を複製する必要があるだけです。ではksh93、このことによって行われvirtual sub-shell呼び出すことはありませんメカニズムfork()。これにより、ksh93 は、フォークなどの非常に遅いようにWin-DOS、などの古いプラットフォームで非常に高速になりますWin-DOS

sh -c cmd 反対側では、現在の対話型シェルと同じである必要がないデフォルトのシェルで新しいプロセスを作成します。

shと現在のシェルが同じ場合でも、これは実行環境を複製しないため、は作成されませんsub-shell


では、を除く他のシェルでksh93は、サブシェルは子シェルですよね?
cuonglm 2016

今日、仮想サブシェルを実装する他の実装は知りません。
schily 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.