サブシェルを動かしてみる
シェル変数を局所的に使用したい場合など、元のシェルの状態に影響を与えないで何らかの処理を行いたい場合、その部分のリストを () で囲むことで、サブシェルを実行させることができる。
sub-shell-example1.sh
SH="Main"
echo "$SH"
(
SH="Sub"
echo "$SH"
)
echo "$SH"
上記のスクリプトを実行させた場合、同じ変数SHを使用しているが、元のシェル変数は変更されない。
sub-shell-result1
$ ./sub_shell-example1.sh
Main
Sub
Main
サブシェルのプロセス
sub-shell-example2.sh
echo "Main"
(
while : ;do
echo "Sub"
done
)
2つのプロセスで動いていることが分かる。
sub-shell-result2
$ ps aux | grep sub-shell
blueskyarea 27800 0.0 0.0 13312 3132 pts/3 S+ 18:54 0:00 /bin/bash ./sub-shell-example2.sh
blueskyarea 27801 94.2 0.0 13312 260 pts/3 R+ 18:54 0:25 /bin/bash ./sub-shell-example2.sh
グループコマンドとの違い
サブシェルは、グループコマンドと似ているが、グループコマンドは同じシェル内で動作する。
sub-shell-example3
SH="Main"
echo "$SH"
{
SH="Sub"
echo "$SH"
}
echo "$SH"
グループコマンドは同じシェルのプロセス上で動いているため、最初に定義したシェル変数が書き換わっている。
sub-shell-result3
$ ./sub_shell3.sh
Main
Sub
Sub
サブシェルの出力をリダイレクト
sub-shell-example4.sh
(
cd
pwd
ls -l
) > sub_output
リダイレクト先のファイル(sub_output)の中身
sub-shell-result4
/home/blueskyarea
total 1516
drwx------ 2 blueskyarea blueskyarea 4096 Aug 2 07:13 Desktop
drwxr-xr-x 2 blueskyarea blueskyarea 4096 Aug 2 07:13 Documents
drwxr-xr-x 4 blueskyarea blueskyarea 4096 Oct 25 17:59 Downloads