回答:
curl --fail
あなたが望むものの一部をします:
からman curl
:
-f, --fail
(HTTP)サーバーエラーでサイレントに失敗します(まったく出力されません)。これは主に、スクリプトなどを有効にして失敗した試行をよりうまく処理するために行われます。通常、HTTPサーバーがドキュメントの配信に失敗すると、その旨を記載したHTMLドキュメントが返されます(多くの場合、理由も説明されています)。このフラグは、curlがそれを出力するのを防ぎ、エラー22を返します。
この方法はフェイルセーフではありません。特に認証が関係している場合(応答コード401および407)、失敗した応答コードがすり抜ける場合があります。
ただし、画面への出力はブロックされます。
カールしたページのコンテンツを表示するだけの場合は、次の操作を実行できます。
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)
if test $STATUSCODE -ne 200; then
# error handling
fi
これにより、ページのコンテンツがSTDERRに書き込まれ、HTTPステータスコードがSTDOUTに書き込まれるため、変数STATUSCODEに割り当てることができます。
0
、スクリプトから非ステータスコードを返す場合はどうでしょうか。
if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi
?
{ code=$(curl ... as above ...); } 2>&1
。トリックは{ ... } 2>&1
、異なるシェルを生成することなくリダイレクトを許可する( ... )
ことです。
フラグの組み合わせを使用してそれを行うことができました:
curl --silent --show-error --fail URL
--silentは進行状況とエラーを隠します
--show-errorは--silent
--failによって隠されたエラーメッセージを表示しますリクエストが失敗すると終了コード> 0を返します
--silent --show-error --fail
同じように動作し-f/--fail
ます。
はい、それを行う方法はありますが、3つのカールオプションが含まれているため、明らかではありません。
curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null
これにより、curlが最終2xx
リターンコードで終了しstdout
、本体を取得したときにのみ成功(0)が発生し、エラーがstderrに表示されることが保証されます。
curlのドキュメントでは、401コードの一部で--failが成功する可能性があることに言及しているため、少し混乱する可能性があることに注意してください。少なくとも--show-errorと同時に使用した場合は、正しくないテストに基づきます。
これまでのところ、これらのオプションでhttp-succedsでなかったときにcurlが成功を返すケースを見つけることができませんでした。