web-dev-qa-db-ja.com

cURL:リダレント時に奇妙な出力を抑制する方法

BashシェルからのcURLリクエストの詳細なセクション(stderrに送られる)だけを印刷しようとしています。

しかし、私がstdoutを次のようにリダイレクトすると:

curl -v http://somehost/somepage > /dev/null

ある種の結果テーブルがstderrへの出力の途中に現れます。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

終わり近くにこれが続きます:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

これはレスポンスヘッダを読みにくくします。

リダイレクトしていないときは、このテキストは表示されません。


効果を見るもう一つの方法:

表が表示されません。

curl -v http://somehost/somepage 2>&1

表が表示されます。

curl -v http://somehost/somepage 2>&1 | cat

1)特定の種類のリダイレクトでのみ表示されるのはどうしてですか?

2)それを抑制するための最善の方法は何ですか?

ありがとうございました

58
Ian Mackinnon

これを試して:

curl -vs -o /dev/null http://somehost/somepage 2>&1

これはプログレスメーターを抑制し、stdout/dev/nullに送り、stderr-vの出力)をstdoutにリダイレクトします。

54
curl --fail --silent --show-error http://www.example.com/ > /dev/null

これはステータスダイアログを抑制しますが、それ以外の場合はSTDERRにエラーを出力します。

user@Host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

上記はリダイレクト時にステータステーブルを出力します。

user@Host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

上記はリダイレクト時のステータステーブルを抑制しますが、それでもエラーはSTDERRに送信されます。

user@Host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve Host 'www.errorexample.com'

上記はSTDERRのエラーの例です。

user@Host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@Host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve Host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve Host 'www.errorexample.com'

STDERRをSTDOUTに(この場合はファイルに)リダイレクトするには、2>&1を最後に追加するだけです。

20
mhoydis

man curlによると:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

使用例

curl -s 'http://www.google.com'

またはHTTP-BODYをbashの変数に取り込む場合

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

-sまたは--silentは互換的に使用できます。

5
Venkatt Guhesan

質問1( cURLは出力がリダイレクトされたときにのみ表を表示する方法を知っている)を参照して、プログラムがその出力が指示されていることを伝えることができるPOSIXシステムには、ファイル記述子が端末を参照しているかどうかを報告する関数 isatty があります。

4
Ian Mackinnon

1)特定の種類のリダイレクトでのみ表示されるのはどうしてですか?

curlのmanページから

HTTP POSTまたはPUT要求の進行状況メーターが必要な場合は、シェルのリダイレクト(>)、-o [file]などを使用して応答出力をファイルにリダイレクトする必要があります。

curlはリダイレクトを決定するために isatty を使用しなければならず、ファイルまたはシェルパイプにリダイレクトされたときにプログレスメーターを表示します。

2)それを抑制する最も良い方法は何ですか?

curlのmanページから

- s、 - silent

サイレントモードまたはクワイエットモード。プログレスメーターやエラーメッセージを表示しません。カールをミュートにします。あなたがそれをリダイレクトしない限り、それはまだあなたが要求するデータを、潜在的にさえ端末/標準出力に出力します。

2
Wyrmwood

本当のエラーメッセージをどこかに置くためには、ログファイルにstrerrを書くべきです。そんな感じ:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
1
user1065951

プロキシの後ろにいるので、私はこのようなコマンドを使います。

date -s "$(curl --proxy http:// PROXY:8080 -s http:// google.com --head -s | grep Date | sed '/ Date:// g') "

0
VeggieVampire