web-dev-qa-db-ja.com

スクリプトの終了コードが返される値とは異なる値を持っているように見えるのはなぜですか?

別のスクリプト(create-docker-container.sh)を呼び出すスクリプト(run-docker-container.sh)があります。 create-docker-containerは、dockerリモートAPIに対してcurlスクリプトを実行し、成功した場合はhttpコードまたはゼロを返します。作成スクリプトはこのように戻ります

echo $RVAL
exit $RVAL

私のテストでは、$ RVALの値は404であり、この質問で関心のある値です。

Run-docker-containerスクリプトには、次の行があります

create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS
rval=$?
echo $rval
if [ $rval -eq 404 ]; then
    ...
fi

createは404で終了しているように見えますが、$?に対して取得している値は148であるため、条件処理は呼び出されていません。これはなぜであり、スクリプトから終了コードを適切に取得するにはどうすればよいですか?

3
Kevin Milner

歴史的な理由から、プロセスの終了ステータスは8ビットの数値です。 exitに渡す数は、256を法として減らされます(2⁸)。

さらに、値126以上は従来の意味を持ち、プログラムの開始の失敗(126または127)またはシグナルによって強制終了されたプログラム(128以上)を示します。したがって、このような値を返すことはできますが、これらの条件をシミュレートする場合を除いて、返す必要はありません。

ルールは、成功の場合は0を返し、エラーの場合は他の値を返すことです。多くのツールが0を成功と解釈する限り、これはルールです。ifwhileなどの条件付きコマンド、set -eの下のシェルスクリプトやmakefileなどのエラーで中止するツールなど。 。

エラーに関して、最も一般的な規則は、エラーが発生した場合は1を返すか、エラーが発生した場合は2を返すことです。 3番目に一般的な規則は、予期される失敗(たとえば、何も見つからない検索コマンド)で1を返し、予期しない失敗(たとえば、検索するファイルが存在しなかった)で2を返すことです。 HTTPエラーコードを終了ステータスにマップする必要がある場合は、1〜125の範囲で再生できます(200の成功は0にマッピングされます)。そのための標準はありません。