別のスクリプト(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以上)によって終了したプログラムを表す一般的な意味を持ちます。したがって、これらの値を返すことはできますが、これらの条件をシミュレートする必要がない限り、その値を返すべきではありません。
ルールは、成功時にゼロを返し、エラーを示すために別の値を返すことです。条件付きコマンド(およびif
)while
、エラー時に中断されるツール(例:set -e
以下のシェルスクリプトやmakefilesなど)など、多くのツールがゼロを成功すると解釈するため、これはルールです。
エラーに関して最も一般的なルールは、エラーがある場合は1を返し、エラーがある場合は2を返すことです。 3番目に最も一般的なルールは、失敗が予想される場合(たとえば、検索コマンドで何も見つからない場合)1を返し、失敗が予期しない場合(たとえば、検索中のファイルが存在しない場合)2を返すことです。 。 HTTPエラーコードを終了ステータスにマッピングする必要がある場合は、1から125の範囲(200が0に正常にマッピングされている)を使用できますが、標準はありません。