サブシェル(子シェル)
()でコマンドを括ると、親シェルからサブシェルとしてコマンドを実行することが可能となる。
サブシェルは、親のシェルの環境変数等を汚したくない時によく使う。
よく使うパターン(1)
一時的に環境変数LANGを英語に変更し、英語でmanpageを見たいとき
$ (LANG=C; man 3 printf)
よく使うパターン(2)
親シェルで一時的にディレクトリを変更して作業したいとき
script
# シェル・スクリプト内で
cd topdir
(cd builddir; make)
# カレントディレクトリは、topdir
よく使うパターン(3)
遅延コマンド実行
script
# シェル・スクリプト内で
(sleep 60; command)&
ワンライナーで実行するコマンドを並列実行
よく使うパターン(3)の振る舞いを応用して、for in do done, while do doneの構文に当てはめれば、ワンライナーで実行するコマンドの並列実行が可能となる。
よく使うパターン[1]: コマンドの応答を待たずに、定期的にコマンドを実行
$ while true; do (sleep 10; program)& done
よく使うパターン[2]: 重い処理のコマンドが成功したらログを保存
$ for i in `seq 1 10`; do ( 重い処理のコマンド && 結果を保存するコマンド )&; done
例.ネットワーク内の機器を検索
$ for i in `seq 1 254`; do (ping -c 1 192.168.1.$i && echo "192.168.1.$i is alive" >> log)&; done
$ cat log
192.168.1.1 is alive
192.168.1.13 is alive
192.168.1.101 is alive
192.168.1.251 is alive
192.168.1.254 is alive
別の方法での並列実行
- xargs -P
- parallelコマンド
上記コマンドを使用することで並列でコマンド実行することが可能です。