exec は、新しいプロセスを作らずに、現在のシェル環境で指定したコマンドを実行する シェルの組み込みコマンドです。
通常のコマンド実行と異なり、exec を使うと現在のシェルプロセスが置き換えられるため、終了後にシェルに戻りません。
また、引数なしで使うと ファイルディスクリプタのリダイレクト に利用できます。
構文(Syntax)
exec [コマンド [引数...]]
exec <リダイレクト>
主な用途
| 用途 | 説明 | 使用例 |
|---|---|---|
| コマンド実行 | シェルを置き換えて実行 | exec /bin/bash |
| スクリプト最適化 | プロセスを余分に作らず効率的に実行 | exec myscript.sh |
| ファイルディスクリプタ操作 | 出力や入力をリダイレクト | exec > logfile.txt |
| FD クローズ | 不要な FD を閉じる | exec 3>&- |
実行例
シェルを新しい bash に置き換える
exec /bin/bash
(元のシェルに戻れなくなり、終了するとログアウトする)
スクリプト内でコマンドを実行(プロセスを増やさない)
#!/bin/bash
echo "Before exec"
exec ls -l
echo "This line will never be executed"
出力例:
total 0
-rw-r--r-- 1 user user 0 Aug 21 15:20 file.txt
(exec の後の行は実行されない)
出力をファイルにリダイレクト
exec > output.log
echo "ログに書き込み"
output.log の内容:
ログに書き込み
標準入力を別ファイルに切り替える
exec < input.txt
while read line; do echo "行: $line"; done
FD を閉じる
exec 3>&-
(ファイルディスクリプタ 3 を閉じる)
エラー例(存在しないコマンドを指定)
exec notfound
出力例:
bash: exec: notfound: not found
(この場合はシェルは終了せずエラーだけ返す)
関連コマンド / 構文
source: シェルを置き換えずにスクリプトを読み込む.(ドットコマンド) :sourceと同義exit: シェルを終了
備考
execは 外部コマンドではなくシェル組み込み です。which execでは場所は出ません。- プログラムのラッパースクリプトで使うと、余計なプロセスを残さず実行できる利点があります。
- リダイレクト専用で使うケースも多く、
exec > logfileとするとその後の出力はすべてファイルに記録されます。
参考
- manページ: man7.org exec(1p)
- GNU Bash Manual: Bash Reference – Bourne Shell Builtins

コメント