「終了コード($?)って何のためにあるの?」
exitコマンドはLinuxの操作やシェルスクリプトを作成する上で欠かせない基本コマンドです。
単にシェルを終了するだけでなく、終了コード(exit status)を使って処理の成否を通知する重要な役割があります。
この記事では、exitコマンドの基本的な使い方から、
シェルスクリプト内での終了コードの活用方法、logoutコマンドとの違い、
実務で役立つパターンまで解説します。
・exit 0は正常終了、exit 1(またはゼロ以外)はエラー終了を意味する
・$?で直前のコマンドやスクリプトの終了コードを確認できる
・exitはサブシェルやスクリプト内でも使えるが、logoutはログインシェルのみ有効
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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 |
特に終了コードの設計を意識することで、スクリプトの信頼性が格段に高まります。
シェルスクリプトをさらに深く学びたい方は、Apacheのタイムアウト設定や
systemctlとchkconfigでサービスを管理する方法も参考にしてください。
exitコマンドと終了コードを理解して、堅牢なシェルスクリプトを書けるようになりたいですか?
終了コードを正しく扱えると、スクリプトのエラーハンドリングが格段に改善されます。現場の手法を体系的に学びましょう。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:logoutコマンドでLinuxからログアウトする方法|exitとの違いやセッション管理も
- 前のページへ:atコマンドで指定時刻にジョブを実行する方法|atq・atrmや書式一覧も
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドA-E・システム管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます