シェルの終了ステータスについて

シェルの終了ステータスについて

シェルの終了ステータス(exit status)とは、シェルが実行したコマンドやプログラムが終了したときに、シェルに返される値のことです。
これは、コマンドが成功したかどうか、またはエラーが発生したかどうかを示す重要な情報です。
終了ステータスは通常、0から255までの整数値を取ります。

終了ステータスの基本的な概念

  • 成功:

一般的に、コマンドが正常に実行された場合、終了ステータスは0になります。
これは、「すべてが正常に終了した」ということを意味します。

  • エラー:

何らかの理由でコマンドが失敗した場合、終了ステータスは0以外の値になります。
多くの場合、1から255の範囲内で特定のエラーを示す数値が返されます。

シェルでの終了ステータスの確認

シェルで直前に実行したコマンドの終了ステータスを確認するには、特殊な変数$?を使用します。
この変数は、最後に実行したコマンドの終了ステータスを保持しています。

$ ls
$ echo $?
0

この例では、lsコマンドが成功し、終了ステータス0が返されています。

一方、存在しないディレクトリをリストしようとした場合は、エラーが発生し、終了ステータスは0以外になります。

$ ls nonexistent_directory
ls: cannot access 'nonexistent_directory': No such file or directory
$ echo $?
2

この場合、lsコマンドがディレクトリを見つけられなかったため、終了ステータスとして2が返されています。

終了ステータスの使い方

終了ステータスは、シェルスクリプトで特に重要です。
スクリプト内でコマンドの成功や失敗を確認し、それに応じて処理を分岐させるために使用されます。

#!/bin/bash

cp source_file target_file
if [ $? -eq 0 ]; then
  echo "ファイルのコピーが成功しました。"
else
  echo "ファイルのコピーに失敗しました。"
fi

このスクリプトでは、cpコマンドが成功したかどうかを確認し、結果に応じてメッセージを表示しています。

特定の終了ステータス

UNIXやLinuxの多くのコマンドは、特定の状況に応じた終了ステータスを持っています。
例えば、grepコマンドは次のような終了ステータスを返します:

  • 0: パターンが見つかった。
  • 1: パターンが見つからなかった。
  • 2: エラーが発生した。
$ grep "pattern" file.txt
$ echo $?
0  # パターンが見つかった場合

$ grep "nonexistent_pattern" file.txt
$ echo $?
1  # パターンが見つからなかった場合

$ grep "pattern" nonexistent_file.txt
grep: nonexistent_file.txt: No such file or directory
$ echo $?
2  # エラーが発生した場合

カスタム終了ステータス

スクリプト内で自分自身の終了ステータスを設定することも可能です。
これはexitコマンドを使用して行います。
例えば、エラーが発生した場合に特定の終了ステータスを返すことができます。

#!/bin/bash

if [ $# -eq 0 ]; then
  echo "エラーメッセージ: 引数が指定されていません。" >&2
  exit 1
fi

echo "引数が指定されました: $1"
exit 0

このスクリプトは、引数が指定されていない場合に1の終了ステータスで終了し、正常に終了する場合は0を返します。

まとめ

シェルの終了ステータスは、コマンドやスクリプトの成否を確認するために不可欠な要素です。
終了ステータスが0の場合は成功を示し、0以外の場合は何らかのエラーや異常な終了があったことを示します。
シェルスクリプトでは、これを活用して条件分岐やエラーハンドリングを行うことができます。