web-dev-qa-db-ja.com

HTTPステータスコードが200ではない場合、cURLを0以外のexitCodeで失敗させることはできますか?

私はいつもcurlがHTTP 500応答を受け取ったときに失敗を意味する終了コード(!= 0)を返していたと仮定していましたが、それはそうではないようです ケース。

HTTPステータスコードが200ではない場合、0以外のexitCodeでcURLを失敗させることができますか?私は-w "%{http_code}"を使用できることを知っていますが、それは終了コードとしてではなく、それをSTDOUTに入れます(さらに、私は出力を取り込むことにも興味を持っています。

211
knocte

curl --failはあなたが欲しいものの一部をします:

from man curl

-f, --fail

(HTTP)サーバエラー時に静かに(まったく出力されずに)失敗します。これは主に、スクリプトなどが失敗した試行をより適切に処理できるようにするために行われます。通常HTTPサーバーがドキュメントを配信できなかった場合は、その旨を記載したHTMLドキュメントを返します(多くの場合、その理由や詳細についても説明します)。このフラグはcurlがそれを出力するのを防ぎ、エラー22を返します。

この方法はフェイルセーフではなく、特に認証が関係する場合(応答コード401および407)、失敗した応答コードがスリップする可能性があります。

しかし、それは画面への出力をブロックします。

236
rampion

丸まったページの内容を表示したいだけの場合は、次のようにします。

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

これは、HTTPステータスコードをSTDOUTに書き込むときにページのコンテンツをSTDERRに書き込むため、変数STATUSCODEに割り当てることができます。

78
Dennis

私はフラグの組み合わせを使ってそれをすることができました:

curl --silent --show-error --fail URL

- silentは進行状況とエラーを隠します。
- show-error--silentで隠されたエラーメッセージを表示します
- failは、要求が失敗したときに終了コード> 0を返します。

26
rcdmk