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

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

別のスクリプト(create-docker-container.sh)を呼び出すスクリプト(run-docker-container.sh)があります。 create-docker-containerはdockerリモートAPIに対してカールスクリプトを実行し、httpコードを返すか、成功した場合は0を返します。したがって、生成スクリプトは以下を返します。

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なので、条件付き処理は呼び出されません。なぜこれが起こり、スクリプトから終了コードを正しく取得するのですか?

ベストアンサー1

歴史的な理由から、プロセスの終了ステータスは8桁の数字です。渡す数字はexitモジュロ256(2⁸)に減ります。

さらに、126以上の値は、起動に失敗したプログラム(126または127)または信号(128以上)によって終了したプログラムを表す一般的な意味を持ちます。したがって、これらの値を返すことはできますが、これらの条件をシミュレートする必要がない限り、その値を返すべきではありません。

ルールは、成功時にゼロを返し、エラーを示すために別の値を返すことです。条件付きコマンド(およびifwhile、エラー時に中断されるツール(例:set -e以下のシェルスクリプトやmakefilesなど)など、多くのツールがゼロを成功すると解釈するため、これはルールです。

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

おすすめ記事