お金をかけずにサーバーの勉強をしよう

黒い画面のコマンドには戻り値というものがある

2023年10月16日

メニューへ戻る

黒い画面で実行するコマンドには戻り値があって、後々シェルスクリプトで使う件。

黒い画面に慣れたところでちょっと脇道にそれますよ。

Linuxコマンドには「戻り値」「返り値」「Return Value」と呼ばれるものがあるって事を個々では覚えておいて貰えればそれだけで良いです。

3つの名前を挙げていますが、どれも同じものを指していて、コマンド実行結果がどうだったかを表す数値のことです。

プログラミング言語を扱ったことがない人は「何言ってんだかサッパリわかんね」ってものなのですが、とりあえずやって見せます。

環境は Lubuntu 22.04.3ですが、他の Linux環境でも同じでしょう。 自分の環境でもやってみて下さい。

こんな感じで、まず lsコマンドを実行してカレントディレクトリのディレクトリ/ファイルのリストを表示します。

subro@Lubuntu2204:~$ ls -l
total 48
drwxrwxr-x  2 subro subro 4096 10月 16 16:54 Desktop
drwxrwxr-x  8 subro subro 4096  2月 25  2023 NetBeansProjects
drwxrwxr-x  2 subro subro 4096  6月 17 06:28 bin
drwx------  9 subro subro 4096 10月  2 17:08 snap
drwxr-xr-x 14 subro subro 4096 10月 11 22:16 work
drwxr-xr-x  2 subro subro 4096 10月  6 11:27 ダウンロード
drwxr-xr-x  2 subro subro 4096 10月 10  2022 テンプレート
drwxr-xr-x  2 subro subro 4096 10月  2 17:28 ドキュメント
drwxr-xr-x  2 subro subro 4096 10月 10  2022 ビデオ
drwxr-xr-x  2 subro subro 4096  2月 25  2023 ピクチャ
drwxr-xr-x  2 subro subro 4096 10月 10  2022 ミュージック
drwxr-xr-x  2 subro subro 4096 10月 10  2022 公開

この「直後に」、以下のようなコマンドを実行します。
直後というのが大事です。

subro@Lubuntu2204:~$ echo $?
0

さて、これは何をしているかですが…。

lsコマンドの実行については、特に言うことはありません。

その次に実行したコイツを解説します。

echo $?

echoコマンド(display a line of text)は、指定されたブツのテキストを表示するもので、画面に何かメッセージを表示するときによく使います。

subro@Lubuntu2204:~$ echo "Hello World!"
Hello World!

こんな風に、この echoコマンド自体も特にこれと言って、何か言う程のこともなく、残る [$?] これが問題です。

Linux環境では、ログインした時に動くシェルは Bashになっていますので、黒い画面は Bashが提供していることになりますけれども(厳密には違う)、[$?] は Bashが持つ特殊な変数で、直近で実行したコマンドの戻り値が入っています

上の例では、lsコマンドの実行結果の戻り値を echoコマンドで画面表示した、ということになります。

[0]が表示されていますが、これは正常終了を表しています。

コマンドの戻り値は基本的に

0正常
それ以外正常ではない何か

を表していると覚えておけば良いです。


試しに lsコマンドで、存在していないディレクトリのリストを取得しようとして、わざとエラーにしてみます。

subro@Lubuntu2204:~$ ls -l ./dark
ls: cannot access './dark': No such file or directory

subro@Lubuntu2204:~$ echo $?
2

戻り値は [2] になりました。


戻り値のうち、[0](正常終了)以外はコマンドごとに意味が違います。

コマンドのマニュアルを表示してくれる manコマンド(an interface to the system reference manuals)で、lsコマンドのマニュアルを見てみましょう。

subro@Lubuntu2204:~$ man ls

そうすると長々としたマニュアルを見ることができますが、下の方にスクロールしていくと、[Exit status:] という項目がありました。

   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

[0]と [2]以外に、[1](パーミッションなどの制限で参照できなかった)もありますね。


コマンド戻り値自体はそんなに難しい観念ではないので「あぁそうですか」という印象だと思います。

でも「画面にエラーが出てるのに、戻り値って何に使うの?存在意義無くね?」って思いませんか?

これはとりも直さず、皆さんが大好きな自動実行で使うものです。

もっと端的に言うと、シェルスクリプト内でコマンドの実行結果をこの値を判定して、次の動作を動的に変更するために使います。

ここではシェルスクリプトの書き方には触れませんが、Bashのシェルスクリプトでは if文という分岐構文が使えますので、そこに分岐の判断材料を提供します。

例えば上の lsコマンドのエラーの場合には「指定したディレクトリを参照できませんでした!」と画面にメッセージを出すとか、ログファイルに失敗の履歴を時刻付きで記録しておくとか、そんな感じで。


以上、大した内容ではないんですが「コマンドには戻り値があるよ」って事だけは覚えておいて下さい。
(各コマンドの戻り値を暗記する必要はありません)


この本ではなく、もっと古い本でも構わないんですが、Linuxのサーバー管理をする上ではこの手の本は必携です。
どの本でもここで書いていることも間違いなく網羅されているはず。
悪いことは言いません、必ず手に入れて下さい。