search
LoginSignup
18

More than 3 years have passed since last update.

posted at

シェルスクリプト exec コマンド

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}" などを参照しても空

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
18