シェルの終了ステータスについて
シェルの終了ステータス(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以外の場合は何らかのエラーや異常な終了があったことを示します。
シェルスクリプトでは、これを活用して条件分岐やエラーハンドリングを行うことができます。