exitコマンドでシェルを終了する方法|終了コードの意味とスクリプト内での活用コマンド

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドA-E, システム管理コマンド > exitコマンドでシェルを終了する方法|終了コードの意味とスクリプト内での活用コマンド
「シェルを終了する方法がわからない」「スクリプトの中でどうやってプログラムを終了させるの?」
「終了コード($?)って何のためにあるの?」

exitコマンドはLinuxの操作やシェルスクリプトを作成する上で欠かせない基本コマンドです。
単にシェルを終了するだけでなく、終了コード(exit status)を使って処理の成否を通知する重要な役割があります。

この記事では、exitコマンドの基本的な使い方から、
シェルスクリプト内での終了コードの活用方法、logoutコマンドとの違い、
実務で役立つパターンまで解説します。
【この記事でわかること】
・exit 0は正常終了、exit 1(またはゼロ以外)はエラー終了を意味する
・$?で直前のコマンドやスクリプトの終了コードを確認できる
・exitはサブシェルやスクリプト内でも使えるが、logoutはログインシェルのみ有効

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

exitコマンドとは?基本的な役割

exitコマンドには2つの主要な役割があります。

シェルやスクリプトを終了する:現在のシェルプロセスまたはシェルスクリプトを終了させる
終了コードを返す:次のプロセス(親プロセスやスクリプト呼び出し元)に処理結果を数値で伝える

特に2番目の「終了コード」は、シェルスクリプトでのエラーハンドリングやパイプラインの制御において非常に重要です。

1. exitコマンドの書式

exit [終了コード] # 終了コードは 0 ~ 255 の整数 # 省略した場合は直前のコマンドの終了コードが使われる

2. 終了コードの意味

終了コード 意味 使い場面
exit 0 正常終了(成功) 処理が正常に完了した
exit 1 一般的なエラー 何らかのエラーが発生した
exit 2 引数エラー・使い方の誤り コマンドライン引数が正しくない
exit 126 コマンドが実行できない 実行権限がない
exit 127 コマンドが見つからない 指定したコマンドが存在しない
exit 128+N シグナルNで終了 Ctrl+C(SIGINT)は130など

終了コード($?)の確認方法

直前に実行したコマンドやスクリプトの終了コードは、特殊変数$?で確認できます。

1. コマンドの終了コードを確認する

$ ls /etc/hostname /etc/hostname $ echo $? 0 # ls が正常終了したため 0 が返る $ ls /no/such/directory ls: '/no/such/directory' にアクセスできません: そのようなファイルやディレクトリはありません $ echo $? 2 # ls がエラー終了したため 2 が返る

2. スクリプトの終了コードを確認する

$ cat check_file.sh #!/bin/bash if [ -f /etc/hostname ]; then echo "ファイルが存在します" exit 0 else echo "ファイルが見つかりません" exit 1 fi $ bash check_file.sh ファイルが存在します $ echo $? 0

シェルスクリプト内でのexitの使い方

シェルスクリプトでのexitコマンドの代表的なパターンを解説します。

1. エラー時に即座に終了する

#!/bin/bash # バックアップ元ディレクトリの存在確認 SRC_DIR="/data/source" if [ ! -d "$SRC_DIR" ]; then echo "ERROR: ソースディレクトリが存在しません: $SRC_DIR" >&2 exit 1 fi # rsyncでバックアップを実行 rsync -av "$SRC_DIR/" /backup/ if [ $? -ne 0 ]; then echo "ERROR: バックアップに失敗しました" >&2 exit 1 fi echo "バックアップが完了しました" exit 0

>&2はエラーメッセージを標準エラー出力に送る記法です。
エラーメッセージは標準エラー出力に出す習慣をつけると、
ログのリダイレクト時に正常出力とエラーを分けられます。

2. set -e でエラー時に自動終了する

スクリプトの先頭にset -eを書くと、
いずれかのコマンドが0以外の終了コードを返した時点でスクリプトが自動終了します。

#!/bin/bash set -e # エラーが発生したら即座に終了する set -u # 未定義変数を参照したらエラーにする set -o pipefail # パイプライン途中のエラーも検知する echo "処理開始" cp /data/source /data/backup # 失敗した場合ここで終了する echo "コピー完了" gzip /data/backup # 失敗した場合ここで終了する echo "圧縮完了" exit 0

set -eは便利ですが、終了コードがゼロ以外でも正常な場合(grepでマッチなし=終了コード1など)に
意図せず終了してしまうことがあります。そのような箇所は|| trueで回避します。

#!/bin/bash set -e # grep でマッチなしは終了コード 1 だが、それは正常 grep "ERROR" /var/log/app.log || true # || true で終了コードを常に 0 にする

3. トラップを使ったクリーンアップ

スクリプトが終了(正常・エラーどちらでも)したときにクリーンアップ処理を実行するには
trapコマンドを組み合わせます。

#!/bin/bash # スクリプト終了時(EXITシグナル)に cleanup関数を実行する trap cleanup EXIT cleanup() { echo "一時ファイルを削除します..." rm -f /tmp/work_$$.tmp echo "クリーンアップ完了" } # 処理 echo "作業開始" echo "処理中..." > /tmp/work_$$.tmp # 途中でエラーが発生してもcleanupが実行される if [ ! -f /data/source ]; then echo "ERROR: ソースファイルが見つかりません" >&2 exit 1 fi echo "処理完了" exit 0

exitとlogoutの違い

ターミナルからログアウトする際に、exitとlogoutの2つが使えますが、動作に違いがあります。

1. exitとlogoutの違いを理解する

# 現在のシェル種別を確認する $ echo $SHELL /bin/bash # ログインシェルかどうかを確認する(先頭に - がついていればログインシェル) $ echo $0 -bash # ← ログインシェル(SSH接続直後など) # または $ echo $0 bash # ← 非ログインシェル(サブシェル)

コマンド ログインシェルで実行 サブシェルで実行
exit ログアウト(セッション終了) サブシェルを終了してログインシェルに戻る
logout ログアウト(セッション終了) エラー(ログインシェルではありません)

2. サブシェル内でのexitの動作

# ログインシェルから bash を起動してサブシェルに入る $ bash $ echo $0 bash # サブシェル $ exit # サブシェルを終了する exit $ echo $0 -bash # ログインシェルに戻ってきた # もう一度 exit するとログアウト $ exit logout Connection to 192.168.1.100 closed.

3. logoutが使えない場合のトラブルシュート

# サブシェル内でlogoutを実行するとエラーになる $ csh % logout ログインシェルではありません. # exitを使えば終了できる % exit exit $

実務での終了コードの活用パターン

1. 終了コードでスクリプトの成否を判定する

#!/bin/bash # メンテナンス前のチェックスクリプト # 別のスクリプトを実行して終了コードで判定 bash /opt/scripts/check_disk.sh if [ $? -eq 0 ]; then echo "ディスク確認OK" else echo "ディスク使用率が閾値を超えています。メンテナンスを中止します" >&2 exit 1 fi bash /opt/scripts/check_service.sh if [ $? -eq 0 ]; then echo "サービス確認OK" else echo "サービスに問題があります。メンテナンスを中止します" >&2 exit 1 fi echo "全チェック完了。メンテナンスを開始します" exit 0

2. cronジョブでの終了コード管理

# crontabの設定例 # スクリプトの終了コードが0以外の場合、cronがメールで通知する 0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 # 終了コードをlogに残す場合 0 3 * * * /opt/scripts/backup.sh; echo "終了コード: $?" >> /var/log/backup.log

本記事のまとめ

exitコマンドの使い方と終了コードの活用をまとめます。
やりたいこと コマンド・記述
正常終了する exit 0
エラー終了する exit 1
直前のコマンドの終了コードを確認する echo $?
エラーで自動終了する設定 set -e(スクリプト先頭に記述)
終了時にクリーンアップを実行する trap cleanup EXIT
サブシェルを終了してログインシェルに戻る exit
ログインシェルを終了してログアウトする exitまたはlogout
exitコマンドは単純に見えて、シェルスクリプトの品質を大きく左右します。
特に終了コードの設計を意識することで、スクリプトの信頼性が格段に高まります。

シェルスクリプトをさらに深く学びたい方は、Apacheのタイムアウト設定
systemctlとchkconfigでサービスを管理する方法も参考にしてください。

exitコマンドと終了コードを理解して、堅牢なシェルスクリプトを書けるようになりたいですか?

終了コードを正しく扱えると、スクリプトのエラーハンドリングが格段に改善されます。現場の手法を体系的に学びましょう。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。