exec コマンドを使うと、同じプロセス内で外部コマンドが実行される。
用途として考えられるのは、もしラッパースクリプトを作って別のスクリプトを呼び出す必要がある場合、ラッパースクリプトから exec を使って別のスクリプトを呼び出すようにすれば、余分なプロセスを作成しないで済む。
exec コマンドを使わない場合
example1
$ ls
例えば、今のプロセスIDが500だとする。
何らかの外部コマンド(lsなど)を実行する前、まず新しいプロセスID(例えば、501)が生成される。
そして新しいプロセスID(501)で、ls コマンドが実行される。
exec コマンドを使う場合
example2
$ exec ls
例えば、今のプロセスIDが500だとする。
何らかの外部コマンド(lsなど)を exec コマンドを用いて実行すると、元のプロセスID 500 内で ls コマンドが実行される。
標準出力をリダイレクトする
exec > output のように実行すると、それ以降実行されるコマンドの標準出力については、output ファイルにリダイレクトされる。
元に戻すためには、exec > /dev/tty を実行する。
example3
$ exec > output
$ pwd
$ exec > /dev/tty # シェルの標準出力先を画面に戻す
$ pwd
/home/blueskyarea
cat output
/home/blueskyarea
環境変数をすべて削除して実行する
exec env - scriptA で呼び出された scriptA はすべての環境変数が削除された状態で実行される。
※ bash では exec -c scriptA で同様の動きになる
example4
export MY_ENV=my-env
echo "${MY_ENV}" # my-env
echo "${LANGUAGE}" # en_US:
exec env - ./other-script.sh # "${MY_ENV}" や "${LANGUAGE}" などを参照しても空