2

The TTY demystifiedを読んでいます。「ジョブとセッション」セクションには、xterm を使用するユーザーの例があります。

$ cat
hello
hello
^Z
[1]+  Stopped                 cat
$ ls | sort

関連するプロセスをリストした表があります: xtermbash( の子xterm)、および最後の 3 つのプロセス ( catlsおよびsort) はすべて同じ PPID (親プロセス ID) を持ちます。これらはすべて同じbashプロセスの子です。

これで、bash のパイプラインはサブシェルで実行されることがわかりました。bashこのサブシェルのことは、各サブシェルに余分なプロセスがあることを意味するといつも思っていました。bash私の質問は次のとおりです。別の 2 つのプロセスが存在するべきではありません。どちらも最初の子であり、最初の子bashになり、2 番目の子になりますか? 記事の表は簡略化されていますか、それともサブシェルの理解が間違っていますか?lsbashsortbash

4

2 に答える 2

3

プログラムは子プロセスで実行されますが、これらはサブシェルではありません。シェルは子をフォークし、必要に応じて標準入力/出力/エラーをリダイレクトし、すぐに呼び出しexecv()てプログラムを実行します。

非常に短い期間、子プロセスはまだ実行bashされていますが、シェルコマンド処理を行っていないため、これをサブシェルとは見なしません。これはすべて元のシェルで行われ、子プロセスは外部プログラムを起動しているだけです。 ( のexecようなコマンドの明示的なものを介しているかのようにls)。

パイプラインの場合、いずれかのコマンドがシェルの組み込みである場合、それらはサブシェルで実行されます。したがって、次のようにします。

ls | read var

2 つの子プロセスが作成されます。1 つの子が実行さlsれ、もう 1 つは実行中のサブシェルになりますread var

于 2014-12-27T20:19:26.773 に答える
2

直接またはパイプ経由で実行可能ファイルを呼び出しても、サブシェルは生成されません。(...)サブシェル内で ( 、などを介して) 明示的に呼び出す場合のみ$(...)、これが行われます。

于 2014-12-27T20:14:43.660 に答える