web-dev-qa-db-ja.com

コマンド置換で使用されるcurlの戻りコード

私は以下のようにスクリプト化しました:-(編集)

httpUrl="http://www.nnin.com"
rep=$(curl -v -X POST -d "UID=username&PWD=pass" $httpUrl)

status=$? 

if [ "$?" -eq 0 ]; then

    echo "Success"
    exit $status
  else
    echo "Failed"
    exit $status
fi

スクリプトを実行すると、戻りコードは常に$?=0スクリプトが正常に実行されたが、cURLの戻りコードを次の関数に適用したいため。

私はこのサイトでいくつかの方法を参照して試してみましたが、POSTコマンドとスクリプトを実行したときに出力が印刷されないようにする方法が原因で、あまり役に立ちません。

ありがとう

6
Asif

コマンドの終了ステータスのキャプチャ

コマンド出力をrep変数に割り当てても、curlコマンドの終了ステータスは失われません。 $?として引き続きご利用いただけます。詳細については、 コマンドの戻り値や出力を変数に保存するにはどうすればよいですか? を参照してください。

失敗したHTTPリクエストのCurl終了コード

通常、リクエストされたHTTPリソースが利用できない場合、ウェブサーバーは関連するHTTPステータスコードに対応するHTMLドキュメントで応答します。 404.このような場合、curlはサーバーからこのドキュメントを受け入れ、Webサーバーからの応答の取得に成功したため、エラードキュメントを表示し、ステータス0で成功して終了します。

HTTPリソースの取得で問題が発生した場合、curlがエラーコードを返すことを期待していると思います。スクリプトでは、HTTPリソースの取得で問題が発生した場合は、curlを失敗ステータスで終了することをお勧めします。そのためには、curlの-f, --failオプションをcurlに提供する必要があります。

サーバーエラーが発生しても、何も表示せずに(まったく出力しない)失敗します。これは主に、スクリプトなどが失敗した試行により適切に対処できるようにするために行われます。通常の場合、HTTPサーバーがドキュメントの配信に失敗すると、そのことを示すHTMLドキュメントが返されます(その理由も説明されています)。このフラグは、curlがそれを出力しないようにし、エラー22を返します。

この方法はフェイルセーフではなく、特に認証が含まれている場合(応答コード401および407)、失敗した応答コードがすり抜ける場合があります。

追加の変数statusを使用して、curlコマンドの終了ステータスを保存できます。

httpUrl="http://www.nnin.com"
rep=$(curl -f -v -d "UID=username&PWD=pass" "$httpUrl")
status="$?"
echo "$rep"
exit "$status"

シェル変数httpUrlは、URLにシェルが解釈できる文字が含まれている場合に備えて、二重引用符で囲む必要があります。また、データが-X POSTオプションで提供される場合、POSTメソッドが常に使用されるため、-dは必要ありません。

(ない)curlコマンドの出力を印刷する

標準出力に出力するだけであれば、curlコマンドの出力をrep変数に保存する必要はありません。

2番目の質問、「出力が印刷されないようにする方法」については、-v/--verboseオプションを-s/--silentに置き換えることができます。オプション(サイレントモード。進行状況メーターやエラーメッセージを表示しない)

実際、最後のコマンドがcurlの呼び出しであれば、スクリプトをさらに簡略化できます。スクリプトの終了コードは、スクリプトの最後のコマンドの戻りコードになります。

httpUrl="http://www.nnin.com"
curl -f -s -d "UID=username&PWD=pass" "$httpUrl"
18