UNIX/Linuxの部屋 コマンド:exit


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド exit 現在のシェルを終了する。シェルの内部コマンド。

最終更新


exit コマンドは、現在実行中のシェルを終了するコマンドである。sh・bash・csh・tcsh などすべてのシェルで使うことができる。


基本的な使い方
コンソールや ssh 経由等でログインして、sh・bash・csh・tcsh などのシェルを実行中のときに、
% exit
と exit コマンドを実行することでそのシェルを終了することができる。ログインシェルであった場合は、ログアウトすることになる。

下記のようにシェルをいくつも起動していた場合、現在実行中のシェル (最後に起動したシェル) を終了し、その直前のシェルに戻ることになる。
(ssh 等でログイン)
% tcsh
% bash
$ csh
% exit → csh を終了
$ exit → bash を終了
% exit → tcsh を終了
% exit → ログインシェルを終了 (=ログアウト)

サスペンド中のプロセスがある場合
もし
% sleep 1000
(Ctrl-z でサスペンド)
[1]+ Stopped sleep 1000
などと Ctrl-Z や stop コマンドなどでサスペンド (中断) したジョブがある場合に exit コマンドを実行しようとすると、
% exit
There are suspended jobs.

% exit
You have stopped jobs.
などと警告されてシェルは終了しない。jobs コマンドで実行中のジョブを確認し、対処しよう。

警告が出ても、もう一度 exit とすればサスペンドしたジョブを残してシェルは終了する。その場合はプロセスに SIGHUP が送られ、(大抵の場合は) プロセスは終了する。しかしなるべくジョブを自分で始末してから exit する方がよいだろう。

Ctrl-d でのシェルの終了
sh・bash・csh・tcsh いずれも、プロンプトで何も入力していない状態で Ctrl-d を入力すると、シェルを抜けることができる。しかしながら bash・tcsh では、行途中での Ctrl-d は補完機能を持つために、誤ってシェルを終了する事故が起こりやすい。
% abc(Ctrl-d)
→ ここでの Ctrl-d はコマンド補完なのに
% (Ctrl-d)
→ これだと exit してしまう!

Ctrl-d によるシェルの終了を抑止するには、csh・tcsh ではシェル変数 ignoreeof、bash では IGNOREEOF を設定するとよい。

シェルスクリプトでの exit コマンド
シェルスクリプト内で exit コマンドを記述すると、そこでスクリプトの実行をやめて終了する。
#!/bin/sh
...
if [ ... ]; then
echo "Error occurred."
exit
fi

一般的には、正常終了時は 0 を、異常終了時は 1 を返すべきであるので、
#!/bin/sh
...
if [ ... ]; then
echo "Error occurred."
exit 1
fi
exit 0
と書くのが望ましい。なお、単に exit と書くと、直前に実行したコマンドの終了ステータスを返して終了してしまうので、シェルスクリプトにおいては exit 0 などと値を明記した方がよいと思われる。詳しくは下記項目を参照のこと。

sh・bash シェルスクリプトの while 内での exit
下記のように while ループ内で exit した場合、シェルスクリプトは終了せず、while do〜done の後の後続処理部分も処理が続いてしまう。なぜならば while ループはサブシェルで実行されるため、exit はサブシェルが終了するだけであり、親のシェルの処理は続行してしまうからである。
#!/bin/sh
cat data.txt | while read line; do
if [ "${line}" = "BAD LINE" ]; then
exit 1
fi
done
... 後続処理 ...

このような場合は、下記のようにループ終了後に終了ステータスを確認し、while ループ内で異常が発生したかをチェックするとよい。
#!/bin/sh
cat data.txt | while read line; do
if [ "${line}" = "BAD LINE" ]; then
exit 99
fi
done
if [ $? = 99 ]; then
exit 1
fi
... 後続処理 ...

関連コマンド
現在のシェルを終了するのではなく、中断して一時的に親のシェルに戻りたい場合は、suspend コマンドを使うとよい。

ログアウトした後も、プログラムを実行させ続けたければ nohup を使うとよい。

関数 exit プロセスを終了する

exit(3) は、標準入出力のバッファを全てフラッシュし、全てのファイルをクローズしてから終了する。_exit(2) を呼ぶ。つまり、終了時にバッファをフラッシュしてほしくなければ _exit(2) を直接呼べばよい。

ただし、_exit(2) は、低水準入出力であるファイルディスクリプタの後始末だけはおこなってくれる。

exit の引数に渡した値は、プログラムの終了ステータスとなる。一般的には、正常終了時には 0 を返し、異常終了時には 1 以上を返すことが多い。

この終了ステータスは sh・bash からは $?、csh・tcsh からは $status で参照でき、コマンドの実行結果がどのようになったかを知ることができる。


頑張って書いたおすすめコンテンツ!
クラウドサービス徹底比較・徹底解説