Bashシェル終了ステータス入門:実例で学ぶ$?変数と終了コードの意味
Bash入門記事では、シェルスクリプトファイルが「シェルインタプリタによって実行されるコマンドのリスト」であることを学びました。本記事ではさらに一歩進んで、シェルコマンドの仕組みと、その内部動作である「終了ステータス」について詳しく解説します。
コマンドとは何か
コマンドとは、単語の連なりとして表現されるものです。最初の単語が実行するコマンドを示し、残りの単語は引数としてコマンドに渡されます。引数には、コマンドの挙動を指定するオプションや、対象となるパラメータが含まれます。
コマンドラインで日常的に実行している一般的なUnixコマンドも、すべてシェルコマンドです。たとえば、ls、lpr、grepなどが代表例です。
$ ls -alF $ lpr filename $ grep "string" filename
シェルコマンドの終了ステータスとは
コマンドの戻り値は「終了ステータス」と呼ばれます。コマンドがシグナルNによって強制終了された場合は、128 + N の値が返されます。終了ステータスは、コマンドの実行結果(成功/失敗)を判定するために使われます。
基本ルールはシンプルです。終了ステータスが0なら成功、非ゼロなら失敗を意味します。主な終了コードの意味は以下の通りです。
| 終了値 | 意味 |
|---|---|
| 0(ゼロ) | 成功 |
| 非ゼロ | 失敗 |
| 2 | 不正な使用法(オプション誤りなど) |
| 126 | 実行権限がない(実行可能ファイルではない) |
| 127 | コマンドが見つからない |
$? シェル変数で終了ステータスを確認する
シェル変数 $? は特殊な組み込み変数で、直前に実行されたコマンドの終了ステータスを常に保持します。
- シェル関数の実行後:
$?は関数内で最後に実行されたコマンドの終了ステータスを返します。 - シェルスクリプトの実行後:
$?はスクリプト内で最後に実行されたコマンドの終了ステータスを返します。
終了ステータスを確認できるサンプルスクリプト
次の exitstatus.sh スクリプトは、さまざまなケースにおける終了ステータスの違いを示す実例です。
$ cat exitstatus.sh #! /bin/bash echo -e "Successful execution" echo -e "=====================" echo "hello world" # 上記コマンドは成功するので、終了ステータスは 0 echo "Exit status" $? echo -e "Incorrect usage" echo -e "=====================" ls --option # 不正なオプション指定のため、終了ステータスは 2 echo "Exit status" $? echo -e "Command Not found" echo -e "=====================" bashscript # bashscriptというコマンドが存在しないため、終了ステータスは 127 echo "Exit status" $? echo -e "Command is not an executable" echo -e "=============================" ls -l execution.sh ./execution.sh # 実行権限がないため、終了ステータスは 126 echo "Exit status" $?
それでは、このスクリプトを実際に実行して、各ケースでどのような終了ステータスが返されるか確認してみましょう。
$ bash exitstatus.sh Successful execution ===================== hello world Exit status 0 Incorrect usage ===================== ls: unrecognized option `--option' Try `ls --help' for more information. Exit status 2 Command Not found ===================== exitstaus.sh: line 15: bashscript: command not found Exit status 127 Command is not an executable ============================= -rw-r--r-- 1 root root 659 Mar 9 13:36 execution.sh exitstatus.sh: line 21: ./execution.sh: Permission denied Exit status 126
出力結果を見ると、正常なコマンド実行では 0、不正なオプション使用では 2、存在しないコマンドでは 127、実行権限のないファイルでは 126 がそれぞれ返されていることが分かります。
注意: 関数やコマンドの戻り値を適切にチェックすることは、プログラマーにとって最重要の責務の一つです。シェルスクリプトを書く際には、$? の確認を習慣にすることをおすすめします。
-
Bash変数チュートリアル – 基本からグローバル変数・ローカル変数まで学べる6つの実用例
Bash変数は、プログラムの実行期間中に必要となる情報を一時的に保存しておくための仕組みです。本記事はBashチュートリアルシリーズの一篇で、他のプログラミング言語と同様にBashでも変数を利用できることを踏まえ、基本的な使い方からグローバル変数とローカル変数の違いまでを、6つの実用的なサンプルを通じて解説します。 Bash変数の基本構文 変数の定義は非常にシンプルで、次の書式に従います。 VARNAME=VALUE 注意: 変数へ代入する際は、「=」記号の前後にスペースを入れてはいけません。「VAR=VALUE」のように書けば、シェルは「=」を代入記号として認識し、この行を変数への代入とし
-
実用的な5つの例で学ぶBashスクリプト入門チュートリアル
Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この