Linuxで「現在のシェルを別のプログラムへ置き換える」という少し特殊な動作を行いたい場面はありませんか?
そんなときに利用するのがexecコマンドです。
execコマンドは、新しいプロセスを作成するのではなく、現在のシェルプロセスを指定したプログラムへ置き換えるためのシェル組み込みコマンドです。
シェルスクリプトやサーバー運用でも利用されることがあり、リダイレクトと組み合わせた使い方もよく登場します。
この記事では、execコマンドの基本的な使い方から、通常のコマンド実行との違い、リダイレクト、シェルスクリプトでの活用方法まで初心者向けに分かりやすく解説します。
execコマンドとは
execは、現在実行中のシェルやシェルスクリプトのプロセスを、指定したプログラムへ置き換えるためのシェル組み込みコマンドです。
通常のコマンド実行とは異なり、新しい子プロセスを作成せず、現在のプロセスそのものが置き換えられる点が大きな特徴です。
execコマンドの基本構文
exec コマンド [引数]
例えばbashへ置き換える場合は次のように実行します。
exec bash
現在のシェルが新しいbashへ置き換わるため、終了すると元のシェルへは戻りません。
通常のコマンド実行との違い
| 実行方法 | 動作 |
|---|---|
bash |
新しいbashプロセスを起動する |
exec bash |
現在のシェルをbashへ置き換える |
通常実行では子プロセスが作成されますが、execでは現在のプロセスがそのまま置き換わります。
execでシェルを置き換える
exec bash
または、別のシェルへ切り替えることも可能です。
exec zsh
終了後は元のシェルへ戻らないため、実行前に動作を理解しておくことが重要です。
シェルスクリプトで利用する例
最後に別プログラムへ処理を引き継ぐ場合によく利用されます。
#!/bin/bash
echo "起動します"
exec python app.py
この場合、シェルスクリプト自身はPythonプログラムへ置き換わるため、exec以降の処理は実行されません。
exec以降の処理は実行されない
execでプロセスが置き換わるため、後続の処理は実行されません。
echo "開始"
exec bash
echo "この行は実行されません"
最後のechoは実行されない点に注意してください。
リダイレクトだけに利用する
execはプロセスの置き換えだけでなく、シェル全体の入出力先を変更する用途でも利用されます。
exec > output.log 2>&1
この設定以降、標準出力と標準エラー出力はoutput.logへ出力されます。
標準入力を変更する
入力元をファイルへ切り替えることもできます。
exec < input.txt
シェルスクリプト全体で同じ入力元を利用したい場合に便利です。
ログファイルへまとめて出力する
シェルスクリプト全体のログを保存したい場合は、冒頭でexecによるリダイレクトを設定する方法がよく利用されます。
#!/bin/bash
exec > script.log 2>&1
echo "開始"
以降の標準出力・標準エラー出力はすべてscript.logへ保存されます。
execとbashの違い
| コマンド | 動作 |
|---|---|
bash |
新しいbashプロセスを起動する |
exec bash |
現在のシェルをbashへ置き換える |
新しいシェルを開きたいだけならbash、現在のシェルそのものを置き換えたい場合はexec bashを利用します。
execとsourceの違い
| コマンド | 役割 |
|---|---|
exec |
現在のプロセスを別プログラムへ置き換える |
source |
現在のシェルでスクリプトを読み込んで実行する |
sourceは現在のシェル環境を維持したままスクリプトを実行しますが、execは現在のプロセス自体を置き換えます。
execとforkの違い
Linuxでは通常、新しいプログラムを実行する際はfork → execという流れで処理が行われます。
| 処理 | 役割 |
|---|---|
| fork | 子プロセスを作成する |
| exec | そのプロセスを別プログラムへ置き換える |
一方、シェル組み込みコマンドのexecは、自分自身のプロセスを直接置き換えるため、新しい子プロセスは作成されません。
シェルスクリプトでexecを使うメリット
シェルスクリプトの最後でexecを利用すると、不要なシェルプロセスを残さずにプログラムへ処理を引き継げます。
#!/bin/bash
echo "Starting..."
exec java -jar sample.jar
長時間動作するプログラムを起動する場合などによく利用されます。
execとリダイレクトを組み合わせる
シェルスクリプト全体のログを取得する用途でもexecはよく使われます。
exec > app.log 2>&1
以降に実行されるコマンドの標準出力・標準エラー出力は、すべてapp.logへ保存されます。
よくあるエラー・注意点
exec後の処理が実行されない
execは現在のプロセスを置き換えるため、後続の処理は実行されません。
exec bash
echo "実行されません"
元のシェルへ戻れない
execで置き換えた場合、終了すると元のシェルへは戻れません。
新しいシェルを一時的に利用したいだけなら、execではなく通常のbashコマンドを利用してください。
リダイレクトが元に戻らない
execで設定したリダイレクトは、そのシェル全体に影響します。
シェルスクリプト内で利用する場合は、影響範囲を理解して使用しましょう。
execは外部コマンドですか?
いいえ。
execはBashなどに組み込まれているシェル組み込みコマンド(ビルトインコマンド)です。
よくある質問
execコマンドは何をするコマンドですか?
現在のシェルやプロセスを、別のプログラムへ置き換えるコマンドです。
通常のコマンド実行と何が違いますか?
通常は子プロセスを作成して実行しますが、execは現在のプロセスそのものを置き換えます。
execのあとに処理を書けますか?
書くことはできますが、通常は実行されません。
execでプロセスが置き換わるためです。
リダイレクトだけでも使えますか?
はい。
シェル全体の標準出力・標準エラー出力を変更する用途でもよく利用されます。
シェルスクリプトではよく使われますか?
はい。
長時間動作するプログラムへの引き継ぎや、ログ出力の設定で利用されることが多くあります。
まとめ
execコマンドは、Linuxで現在のプロセスを別のプログラムへ置き換えたり、シェル全体の入出力設定を変更したりするための重要なシェル組み込みコマンドです。
特に次のコマンドは覚えておくと便利です。
| コマンド | 用途 |
|---|---|
exec bash |
現在のシェルをbashへ置き換える |
exec zsh |
現在のシェルをzshへ置き換える |
exec > app.log 2>&1 |
シェル全体の出力先を変更する |
exec < input.txt |
標準入力をファイルへ変更する |
exec python app.py |
現在のプロセスをPythonプログラムへ置き換える |
Linuxでシェルスクリプトを作成する際は、「通常実行は子プロセスを作成する」「execは現在のプロセスを置き換える」「リダイレクトではシェル全体へ影響する」という3つのポイントを理解しておくと、安全かつ効率的なスクリプトを書けるようになります。




コメント