別のスクリプト(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であるため、条件処理は呼び出されていません。これはなぜであり、スクリプトから終了コードを適切に取得するにはどうすればよいですか?
歴史的な理由から、プロセスの終了ステータスは8ビットの数値です。 exit
に渡す数は、256を法として減らされます(2⁸)。
さらに、値126以上は従来の意味を持ち、プログラムの開始の失敗(126または127)またはシグナルによって強制終了されたプログラム(128以上)を示します。したがって、このような値を返すことはできますが、これらの条件をシミュレートする場合を除いて、返す必要はありません。
ルールは、成功の場合は0を返し、エラーの場合は他の値を返すことです。多くのツールが0を成功と解釈する限り、これはルールです。if
やwhile
などの条件付きコマンド、set -e
の下のシェルスクリプトやmakefileなどのエラーで中止するツールなど。 。
エラーに関して、最も一般的な規則は、エラーが発生した場合は1を返すか、エラーが発生した場合は2を返すことです。 3番目に一般的な規則は、予期される失敗(たとえば、何も見つからない検索コマンド)で1を返し、予期しない失敗(たとえば、検索するファイルが存在しなかった)で2を返すことです。 HTTPエラーコードを終了ステータスにマップする必要がある場合は、1〜125の範囲で再生できます(200の成功は0にマッピングされます)。そのための標準はありません。