【Linux入門】終了ステータス

終了ステータスの概要

  • プロセスが終了すると、その結果を示すために終了ステータスが返される。
  • 終了ステータスは通常、0から255の範囲の整数で表される。

特殊な変数「$?」

  • $?」は直前に実行されたコマンドの終了ステータスを示す特殊な変数。
  • 0: コマンドが成功したことを示す。
  • 0以外の数値: コマンドが失敗したことを示す。

終了ステータスの確認

  • $?変数を使用して、直前のコマンドの終了ステータスを取得できる。
$ echo $?  # 直前に実行したコマンドが成功したか?
0      # コマンドの実行が成功した

終了ステータスがエラーの例

以下のシェルスクリプト「script1.sh」を例に終了ステータスがエラーを示す場合について解説します。

【script1.sh】

#!/bin/bash

ls non-existent-file
if [ $? -ne 0 ]; then
    echo "ls コマンドがエラーを返しました。"
fi

 「ls non-existent-file」の「non-existent-file」は存在しないファイルやディレクトリです。「non-existent-file」というファイルやディレクトリがない場合、このシェルスクリプトを実行すると以下のように出力されます。

$ bash script1.sh 
ls: non-existent-directory にアクセスできません: そのようなファイルやディレクトリはありません
ls コマンドがエラーを返しました。

 シェルスクリプト内の「ls non-existent-file」でエラーが発生します。ここで、0以外の終了ステータスを返します。if文直前のlsコマンドにエラーが発生したため、「ls コマンドがエラーを返しました。」と表示します。

終了ステータスの利用

終了ステータスを利用して条件分岐やエラーハンドリングを実装することができます。

grepコマンドはファイル中の文字列を検索するコマンドです。

 シェルスクリプト「script2.sh」を実行すると、「file.txt」に "pattern" という文字列が含まれる場合、「ファイル内にパターンが見つかりました。」と表示し、文字列が含まれない場合、「パターンは見つかりませんでした。」と表示します。

【script2.sh】

#!/bin/bash

grep "pattern" file.txt
if [ $? -eq 0 ]; then
    echo "ファイル内にパターンが見つかりました。"
else
    echo "パターンは見つかりませんでした。"
fi

カスタム終了ステータスの設定

 スクリプトやプログラム内で特定の終了ステータスを設定するには、「exit 0以外の番号」と指定します。

exit 1  # カスタムのエラーコード1で終了

終了ステータスの一般的な意味

  • 0: 成功
  • 0以外の数値: エラーコード