スクリプトの起動時に終了ステータスが常にゼロになるのはなぜですか?

スクリプトの起動時に終了ステータスが常にゼロになるのはなぜですか?

次のスクリプトがありますjudge

#!/bin/bash
echo "last exit status is $?"

常に「最後の終了状態がゼロでした」を出力します。たとえば、

ls -l;   judge # correctly reports 0
ls -z;   judge # incorrectly reports 0
beedogs; judge # incorrectly reports 0

なぜ?

答え1

各コード行は異なる bash プロセスによって実行され、$?プロセス間で共有されません。judgebash関数を生成することでこの問題を解決できます。

[root@xxx httpd]# type judge
judge is a function
judge ()
{
    echo "last exit status is $?"
}
[root@xxx httpd]# ls -l / >/dev/null 2>&1; judge
last exit status is 0
[root@xxx httpd]# ls -l /doesntExist >/dev/null 2>&1; judge
last exit status is 2
[root@xxx httpd]#

答え2

説明で説明したように$?変数は、シェルに値を返した最後のプロセスの値を保持します。

judge前のコマンドの状況に応じていくつかの操作を実行する必要がある場合は、引数を受け入れて状態を渡すことができます。

#!/bin/bash
echo "last exit status is $1"
# Or even 
return $1

だから:

[cmd args...]; judge $?

関連情報