シェルは、Linuxシステムでコマンドを入力するための基本インターフェースです。このコマンドを使用すると、コマンドを直接入力することも、実行する一連のコマンドを含むファイル(スクリプト)を指定することもできます。シェルは階層構造になっており、どのシェルでも新しいシェルを作成できます。新しいシェルは、それを作成する親シェルのサブシェルである子プロセスと見なされます。
デフォルトでは、サブシェルはその親プロセスに依存しています。つまり、親プロセスが終了するとサブシェルも終了します。すべての出力は、サブシェルから親シェルに渡されます。
サブシェルを作成する方法
Bashシェルスクリプトでは、かっこ表記を使用してサブシェルを作成します。
この例では、whileループはかっこで囲まれているため、スクリプトファイルが実行されるシェルのサブシェルで実行されます。
バックグラウンドでのサブシェルの実行
サブシェルをバックグラウンドで実行するように指定しない限り、親シェルはサブシェルが終了するのを待ってから、残りのスクリプトを続行します。ただし、サブシェルを並行して実行する場合は、バックグラウンドで実行します。これは、以下に示すように、サブシェル式に続くアンパサンド文字で行います。
複数のサブシェルを並列で実行する
複数のサブシェルをバックグラウンドプロセスとして作成する場合は、タスクを並行して実行できます。通常、オペレーティングシステムは、プロセスと同じ数のプロセッサまたはコアが存在すると仮定すると、各プロセスおよびサブプロセスごとに異なるプロセッサまたはコアを使用します。それ以外の場合、タスクは同じプロセッサまたはコアに割り当てられます。その場合、プロセッサまたはコアは、タスクが完了するまで、割り当てられたタスクを連続的に切り替える。次の例には2つのサブプロセスがあります。最初のものは1〜99、2番目のものは1000〜1099です。
waitステートメントを使用して、残りのスクリプトを続行する前に、親プロセスがサブプロセスが終了するのを待つように指示します。
サブシェルの使用
サブシェルは、特定の環境またはディレクトリでコマンドを実行する必要がある場合に便利です。各コマンドが別のサブシェルで実行される場合、変数の設定が混在するリスクはありません。完了時には、親プロセスの環境はサブプロセスの影響を受けないため、設定と現在のディレクトリを復元する必要はありません。
サブシェルは、異なるパラメータで複数回実行できるように、関数定義で使用できます。