用語集
サブシェル
シェルから起動された子プロセスのシェル
サブシェルとは、シェル (sh や csh など) から起動された子プロセスのシェルのことである。特に、シェルスクリプト上から起動したシェルのことをサブシェルと呼ぶことが多い。
●概要
シェルのプロンプトが表示されているときに
や
とすると、シェルはサブシェル (子プロセス) を起動し、サブシェルは括弧内のコマンドを実行する。
サブシェルを使うことで、プロセスをグループ化することができる。例えば
% (コマンド1 ; コマンド2) | コマンド3
% (コマンド1 ; コマンド2) > 出力ファイル
% (コマンド1 ; コマンド2 ; コマンド3) > 出力ファイル
% コマンド1 | (コマンド2 ; コマンド3)
% (コマンド1 | コマンド2) | (コマンド2 ; コマンド3)
などと複数のコマンドの出力を 1つのパイプに流したり、1つのファイルに渡すことが可能になる。
まず、シェルとサブシェルは別プロセスであることに注意しよう。
とするとシェルのカレントディレクトリが変更されてしまうため、元のディレクトリに戻るには cd .. などとしなくてはならない。しかしサブシェルを使って
とすれば、元々起動していたシェルのカレントディレクトリは変更されない。
これはカレントディレクトリはプロセスごとに管理されているためで、サブシェルのカレントディレクトリが変更されても、親プロセスであるシェルのカレントディレクトリには影響を与えないからである。
まとめると以下のようになる。
●使い道 1
別のディレクトリで作業をしたいが、カレントディレクトリは変更したくない場合。
●使い道 2
プロセスごとに異なるカレントディレクトリを設定したい場合。
% cd /dir1 ; tar cf - . | (cd /dir2 ; tar xf -)
特定プロセスのみに環境変数を指定したい場合。
% (env HOGE=fuga; cmd1 ; cmd2)
つまり、カレントディレクトリ・環境変数・umask・リミットなど、プロセス固有の値を一時的に変更したい場合、影響範囲をサブシェル内におさえることができる。
●使い道 3
複数プロセスをまとめてバックグラウンドで動かす場合。100秒後に cmd1 を実行したい場合、
とすると 100秒間端末を占有されてしまう。サブシェルを使うと、両方のプロセスをバックグラウンドで動かすことができる。