= Exec 組込みコマンド
:encoding: UTF-8
:lang: ja
//:title: Yash マニュアル - Exec 組込みコマンド

dfn:[Exec 組込みコマンド]はシェルのプロセスを別の外部コマンドに置き換えます。またシェルのプロセスに対してリダイレクトを実行します。

[[syntax]]
== 構文

- +exec [-cf] [-a {{コマンド名}}] [{{コマンド}} [{{引数}}...]]+

Exec コマンドでは、{zwsp}link:posix.html[POSIX 準拠モード]であるかどうかにかかわらずオプションはオペランドより先に全て指定しなければなりません。これは exec コマンドに対するオプションと{{コマンド}}に対するオプションを区別するために重要です。{{コマンド}}より後にある引数はすべて{{引数}}とみなされます。

[[description]]
== 説明

Exec コマンドを{{コマンド}}を指定して実行すると、シェルは{zwsp}link:exec.html#simple[単純コマンドの実行]の最後のステップと同様にしてコマンドを実行します。ただし、コマンドは必ず外部コマンドとしてみなされ、関数や組込みコマンドは無視します。そしてその外部コマンドはサブシェルではなく現在の{zwsp}link:exec.html#environment[コマンド実行環境]で exec システムコールを呼び出すことで実行します。これにより、シェルのプロセスは新しく起動するコマンドに置き換わります。

シェルが{zwsp}link:interact.html[対話モード]でないとき、コマンドの起動に失敗するとシェルは直ちに終了します。

シェルが POSIX 準拠モードではなくかつ対話モードのとき、停止中のジョブがあると、シェルは警告を表示し、コマンドを起動しません。一度 exec が実行されると、シェルが持っているジョブの情報は失われるため、手動でシグナルを送ってジョブを再開または終了させなければならなくなります。警告を無視してコマンドを起動するには +-f+ (+--force+) オプションを付けてください。

{{コマンド}}なしで実行した場合 exec コマンドは何も行いませんが、この exec コマンドを実行する際に行った{zwsp}link:redir.html[リダイレクト]の効果は現在のコマンド実行環境に残ります。

[[options]]
== オプション

+-a {{コマンド名}}+::
+--as={{コマンド名}}+::
{{コマンド}}の代わりに{{コマンド名}}をコマンド名としてコマンドに渡します。

+-c+::
+--clear+::
既存の{zwsp}link:params.html#variables[環境変数]をすべて削除した状態でコマンドを実行します。ただしこの exec コマンドを実行する際に行った変数代入の結果は環境変数としてコマンドに渡します。

+-f+::
+--force+::
警告を無視してコマンドを実行します。

[[operands]]
== オペランド

{{コマンド}}::
実行するコマンドです。

{{引数}}...::
実行するコマンドに渡すコマンドライン引数です。

[[exitstatus]]
== 終了ステータス

指定されたコマンドの起動に成功した場合、シェルのプロセスはそのコマンドのプロセスに置き換わってしまうので、終了ステータスはありません。

実行しようとしたコマンドが見つからなかった場合、終了ステータスは 127 です。コマンドが見つかったが実行できなかった場合、終了ステータスは 126 です。{{コマンド}}を指定せずに exec コマンドを実行した場合、終了ステータスは 0 です。

[[notes]]
== 補足

Exec コマンドは{zwsp}link:builtin.html#types[特殊組込みコマンド]です。

POSIX にはオプションに関する規定はありません。よってオプションは link:posix.html[POSIX 準拠モード]では使えません。

// vim: set filetype=asciidoc expandtab:
