Bashが各コマンドを実行するための子プロセスを生成するかどうか

Bashが各コマンドを実行するための子プロセスを生成するかどうか

通常のコマンドを複数回実行するたびに、psプロセスID(PID)が異なります。これは、私たちが端末で実行するすべてのコマンドが、そのコマンドを実行するためにbashサブプロセスを生成することを意味するのだろうか?

ベストアンサー1

はい、コマンドラインで実行されるほとんどすべてのコマンドは独自のプロセスで実行され、そのプロセスはそれを開始したシェルの子プロセスです。

ここでの例外はシェルの組み込みコマンドです。 Bashはデフォルトでprintf、、、echoおよびtrue/などの一部の標準ユーティリティを実装するため、falseこれらのユーティリティを実行してもkillサブキーを分岐しません。 、 、 などの項目にも同様に適用されます。ただし、シェルの内部状態に影響を与えるため、内蔵する必要があります。[testcdreadmapfile

(またbreak、、、continueおよびは、奇妙なことに、などのシェルキーワードではreturnなく組み込みユーティリティです。)ifwhile

シェルが自分と同じプロセスで外部プログラムを実行し、まだ戻ることができる方法は実際にはありません。しかし、シェルでは可能です。変える他のプログラムとしてそれ自体。たとえば、シェルのPIDビューを実行してからecho $$exec psを実行すると、終了するpspsシェルはもう存在しません。実際に、fork()サブルーチン()を実行したいプログラムに置き換えるexecve()前に、シェルが独自のコピー(システムコール)を作成することを除いて、通常の方法でプログラムを実行するたびに同様のことが起こります。子プロセスで実行されるシェルプログラム間で子プロセスのリダイレクトなどを設定することを担当します。

シェルは、同じプログラムファイル内のより大きな標準ユーティリティセットであるBusybox実装などの他のツールを組み込みで実装することもできます。しかし、私がテストしたところでは、子プロセスを実行してもまだ子プロセスを分岐します。これは、おそらくユーティリティが不必要にシェルの状態を台無しにすることができないことを確認する簡単な方法だからです。

おすすめ記事