通常のコマンドを複数回実行するたびに、ps
プロセスID(PID)が異なります。これは、私たちが端末で実行するすべてのコマンドが、そのコマンドを実行するためにbashサブプロセスを生成することを意味するのだろうか?
ベストアンサー1
はい、コマンドラインで実行されるほとんどすべてのコマンドは独自のプロセスで実行され、そのプロセスはそれを開始したシェルの子プロセスです。
ここでの例外はシェルの組み込みコマンドです。 Bashはデフォルトでprintf
、、、echo
およびtrue
/などの一部の標準ユーティリティを実装するため、false
これらのユーティリティを実行してもkill
サブキーを分岐しません。 、 、 などの項目にも同様に適用されます。ただし、シェルの内部状態に影響を与えるため、内蔵する必要があります。[
test
cd
read
mapfile
(またbreak
、、、continue
およびは、奇妙なことに、などのシェルキーワードではreturn
なく組み込みユーティリティです。)if
while
シェルが自分と同じプロセスで外部プログラムを実行し、まだ戻ることができる方法は実際にはありません。しかし、シェルでは可能です。変える他のプログラムとしてそれ自体。たとえば、シェルのPIDビューを実行してからecho $$
次exec ps
を実行すると、終了するps
とps
シェルはもう存在しません。実際に、fork()
サブルーチン()を実行したいプログラムに置き換えるexecve()
前に、シェルが独自のコピー(システムコール)を作成することを除いて、通常の方法でプログラムを実行するたびに同様のことが起こります。子プロセスで実行されるシェルプログラム間で子プロセスのリダイレクトなどを設定することを担当します。
シェルは、同じプログラムファイル内のより大きな標準ユーティリティセットであるBusybox実装などの他のツールを組み込みで実装することもできます。しかし、私がテストしたところでは、子プロセスを実行してもまだ子プロセスを分岐します。これは、おそらくユーティリティが不必要にシェルの状態を台無しにすることができないことを確認する簡単な方法だからです。