Linuxの戻り値(終了ステータス)とは?シェルスクリプト初心者向けに徹底解説
生徒
「Linuxのコマンドを実行したあと、その命令が成功したのか失敗したのかを確認する方法はありますか?」
先生
「ありますよ。Linuxには戻り値(モドリチ)、または終了ステータス(シュウリョウステータス)という仕組みが備わっています。」
生徒
「モドリチ……。なんだか難しそうですね。画面にエラーが出なければ成功だと思っていました。」
先生
「実は画面に何も出なくても、裏側で数値として結果を返しているんです。これを知るとシェルスクリプトで自動化するときに、とても便利になりますよ。」
Linuxを初めて学ぶ人や、 OS・プロセス・メモリ管理・仮想マシン・コンテナの仕組みを図解で理解したい人におすすめの定番書籍です。
試して理解 Linuxのしくみを見る※ Amazonアソシエイト広告リンク
1. 戻り値と終了ステータスの基本
Linux(リナックス)の世界では、コマンドやプログラムが実行を終えたときに、呼び出し元であるシェル(bashやzshなど)に対して「仕事が終わりました」という報告を送ります。この報告のことを戻り値(モドリチ)、あるいは終了ステータス(シュウリョウステータス)と呼びます。
この値は、0から255までの整数で表されるのが一般的です。最大の特徴は、「0であれば成功」「0以外(1から255)であれば失敗や異常終了」を意味するという点です。日常生活の感覚だと「1が1番で成功」と思いがちですが、Linuxでは「問題なし(ゼロ)」が成功であることを覚えておきましょう。
この仕組みは、シェルスクリプト(命令をまとめた台本のようなもの)を作成する際に、前のコマンドが成功したときだけ次の処理に進む、といった条件分岐(ジョウケンブンキ)を行うために不可欠な要素です。歴史的には、UNIX(ユニックス)の時代から引き継がれている非常にシンプルかつ強力なエラーハンドリングの手法です。
2. 特殊変数「$?」で戻り値を確認する方法
実行した直後のコマンドの戻り値を確認するには、特殊変数(トクシュヘンスウ)である$?(ダラー・クエスチョン)を使用します。この変数には、直前に実行されたコマンドの結果が一時的に保存されています。echo(エコー)コマンドを使って中身を表示させてみましょう。
まずは、確実に成功するコマンドであるlsを実行したあとに、戻り値を確認してみます。
ls
Documents Downloads Music Pictures Videos
echo $?
0
実行結果として「0」が表示されました。これはlsコマンドが正常に動作し、ディレクトリの内容を表示できたことを意味します。戻り値を確認することで、目に見えるエラーがなくてもシステムが正しく処理を完了したことを証明できます。
3. 失敗時の戻り値を見てみよう
次に、わざとエラーが発生するような操作を行い、0以外の数値が返ってくる様子を確認してみましょう。存在しないファイルを表示しようとしたり、存在しないディレクトリに移動しようとしたりすると、Linuxはエラーメッセージとともに0以外の終了ステータスを返します。
以下の例では、存在しない「secret_file」というファイルをcat(キャット)コマンドで開こうとしています。
cat secret_file
cat: secret_file: No such file or directory
echo $?
1
戻り値として「1」が返ってきました。これは「一般的なエラー」を指す数値です。他にも、コマンドが見つからない場合は「127」、権限がなくて実行できない場合は「126」など、原因によって数値が使い分けられることもあります。初心者のうちは、「0以外なら何らかのトラブルがあった」と判断できれば十分です。OS(オペレーティングシステム)の種類や、実行するシェル(bash, zsh, dashなど)によって、細かな数値の意味が変わることもあります。
4. シェルスクリプトでの条件分岐への活用
戻り値が最も活躍するのは、シェルスクリプト内で「もし成功したらこの処理をする」という制御を行うときです。if文(イフブン)を使うと、終了ステータスを判定して処理を分けることができます。プログラムの世界では、この戻り値を確認することを「終了ステータスをチェックする」と言います。
以下のスクリプト例は、特定のディレクトリを作成し、その作成が成功したかどうかを判断する簡単なプログラムです。ファイル名は「test_script.sh」として作成した想定です。
mkdir new_folder
if [ $? -eq 0 ]; then
echo "ディレクトリの作成に成功しました。"
else
echo "ディレクトリの作成に失敗しました。"
fi
ここで使われている-eqは「equal(イコール:等しい)」の略称で、数値が同じかどうかを比較する記号です。このように戻り値を活用することで、エラーが起きたまま処理が続行されて、大切なデータが消えてしまうといった事故を防ぐことができます。システム運用やインフラ構築の現場では、戻り値のチェックは「基本中の基本」として徹底されています。
5. 論理演算子を使った簡潔な書き方
if文をわざわざ書かなくても、コマンドを記号でつなぐだけで戻り値を利用した制御が可能です。よく使われるのが「&&(アンパサンド2つ)」と「||(パイプ2つ)」という演算子(エンザンシ)です。これらは、コマンドの成功・失敗に基づいて動作を決定します。
&&は「前のコマンドが成功(0)したときのみ、次のコマンドを実行する」という動きをします。反対に||は「前のコマンドが失敗(0以外)したときのみ、次のコマンドを実行する」という動きです。
cd work_dir && ls
bash: cd: work_dir: No such file or directory
上記の例では、cdに失敗したため、後ろのlsは実行されませんでした。これにより「目的の場所に移動できていないのに一覧を表示しようとする」という無駄な動作を防いでいます。これを応用すると、バックアップが成功したときだけ古いファイルを消す、といった安全な処理が1行で記述できるようになります。
6. 自作スクリプトで戻り値を設定する「exit」
自分でシェルスクリプトを書くとき、そのスクリプト自体の戻り値を自由に決めることができます。それにはexit(エグジット)コマンドを使用します。exitの直後に数値を書くことで、そのスクリプトを呼び出した親プロセス(プロンプトや他のプログラム)に結果を伝えることができます。
例えば、スクリプト内で必要なファイルが見つからなかった場合に、異常終了として「9」を返す例を見てみましょう。
# スクリプトの中身の一部
if [ ! -f config.txt ]; then
echo "設定ファイルが見つかりません。"
exit 9
fi
exit 0
これを実行したあと、元の画面でecho $?と打つと「9」が表示されます。これにより、あなたの作ったプログラムが他の大きなシステムの一部として組み込まれたときに、後続のプログラムが「あ、このスクリプトは設定ファイルがなくて失敗したんだな」と判断できるようになります。これはプロフェッショナルな開発において非常に重要な作法です。
7. 戻り値に関するよくある勘違い
初心者が陥りやすい罠として、「コマンドが画面に出力する文字列」と「戻り値」を混同してしまうことがあります。例えば、grep(グレップ)コマンドは、特定の文字列を探すコマンドですが、その挙動は少し特殊です。
「文字列が見つかった場合」は画面にその行が表示され、戻り値は「0(成功)」になります。「文字列が見つからなかった場合」は、画面には何も表示されませんが、戻り値は「1(失敗:見つからなかった)」となります。つまり、画面に何も出ないからといってエラーが起きたわけではなく、「見つからない」という結果を正しく戻り値で報告しているのです。
このように、Linuxのコマンドは「標準出力(画面への表示)」と「終了ステータス(戻り値としての数値)」という2つの出口を持っていることを意識してください。エンジニアはこの2つを使い分けることで、人間にとっての情報とプログラムにとっての情報を整理して扱っています。
8. rootユーザーでの戻り値確認
管理者権限(かんりしゃけんげん)を持つroot(ルート)ユーザーで作業する場合も、戻り値の扱いは同じです。しかし、管理者特有のコマンド(システム設定の変更など)では、失敗の影響が大きいため、より慎重に終了ステータスを確認する癖をつけましょう。
例えば、ネットワークサービスを再起動するコマンドなどは、一見成功したように見えても内部で設定エラーが起きている場合があります。そんなときは、すぐに$?を確認して、しっかりと0が返ってきているかを確かめるのが熟練者のテクニックです。
systemctl restart apache2
echo $?
0
もしここで「1」などの数値が出た場合は、すぐにログファイル(記録用のファイル)を確認して原因を特定する必要があります。戻り値は、いわばシステムの「健康診断の結果」のようなものです。こまめにチェックすることで、大きなトラブルを未然に防ぐことができるようになります。
LPICレベル1の合格を目指している人や、 Linuxコマンド・シェル・ネットワーク・セキュリティの試験対策を効率よく進めたい人におすすめの定番問題集です。
Linux教科書 LPICレベル1 スピードマスター問題集を見る※ Amazonアソシエイト広告リンク
まとめ
これまでの解説を通して、Linuxにおける戻り値(終了ステータス)がいかに重要な役割を果たしているかをご理解いただけたでしょうか。普段、私たちが端末(ターミナル)でコマンドを叩く際、画面に表示される結果だけを見てしまいがちですが、その裏側では数値による「成否の報告」が常に行われています。
終了ステータスの重要ポイント
Linuxシステムを効率的に運用し、正確な自動化を実現するためには、以下の三つのポイントを常に意識しておく必要があります。
- 「0」は正常終了、「0以外」は異常終了を意味する
- 特殊変数「$?」を使えば、直前の結果をいつでも確認できる
- シェルスクリプトの条件分岐(if文)の判定材料として必須である
初心者のうちは、エラーが出たときに慌ててしまうかもしれません。しかし、戻り値の仕組みを知っていれば、「なぜ失敗したのか」を数値から推測する手がかりが得られます。例えば、権限不足なら「126」、コマンドが見つからないなら「127」といった具合に、システムは親切にヒントを投げ続けてくれているのです。
応用:複数のコマンドを組み合わせる実践例
実際の現場では、複数のコマンドを組み合わせて、一連の処理がすべて成功したかどうかを確認する手法がよく使われます。以下のサンプルプログラムは、バックアップ処理を想定したシェルスクリプトの記述例です。学んだ知識をどのようにコードへ落とし込むか確認してみましょう。
#!/ title="backup_check.sh"
# ディレクトリの作成を試みる
mkdir -p /var/backup/log
# 作成に成功したか(戻り値が0か)を確認
if [ $? -eq 0 ]; then
echo "バックアップ用ディレクトリの準備が完了しました。"
# 続けてファイルのコピーを実行し、その成否でメッセージを変える
cp -r /var/www/html /var/backup/log/ && echo "コピーに成功しました。" || echo "コピーに失敗しました。"
else
echo "ディレクトリの作成権限がないか、ディスクがいっぱいです。"
exit 1
fi
exit 0
このように、戻り値を適切にハンドリングすることで、システムの信頼性は飛躍的に高まります。「成功したときだけ実行する」という安全策を講じることは、プロフェッショナルなエンジニアへの第一歩と言えるでしょう。
生徒
「先生、戻り値について詳しく教えていただきありがとうございました。今まで画面に出る英語のエラーメッセージばかり気にしていましたが、実は裏側で数字がやり取りされていたんですね。」
先生
「その通りです。目に見える出力は人間向け、戻り値(数値)はプログラム向けの情報だと考えると整理しやすいでしょう。シェルスクリプトを書くときは、この数値を見張ることで、ミスを防げるようになるんですよ。」
生徒
「echo $?を打ってみる癖がつきました。成功したときに『0』が出ると、なんだか安心します。でも、成功が『1』じゃないのは、やっぱり不思議な感じがしますね。」
先生
「ふふ、確かに。でも、理由はシンプルなんです。『成功』は一つの状態しかありませんが、『失敗』にはたくさんの理由がありますよね。だから成功を唯一の『0』に割り当てて、空いた『1から255』をエラーの種類に振り分けているんです。」
生徒
「なるほど。失敗の数だけ理由があるから、数字が足りるように工夫されているんですね。シェルスクリプトで&&や||を使う方法も、コードが短くなって便利だと思いました。」
先生
「そうですね。現場ではmake && make installのように、前の処理が成功したら次へ進むという書き方がよく使われます。これから色々なコマンドを試すときは、ぜひ終了ステータスもセットで確認してみてください。それがLinuxマスターへの近道ですよ。」
生徒
「はい、頑張ります。エラーが出ても、戻り値を見て『なぜダメだったのか』を冷静に考えられるようになりたいです。」