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)それを抑制するための最善の方法は何ですか?
ありがとうございました
これを試して:
curl -vs -o /dev/null http://somehost/somepage 2>&1
これはプログレスメーターを抑制し、stdout
を/dev/null
に送り、stderr
(-v
の出力)をstdout
にリダイレクトします。
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を最後に追加するだけです。
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
は互換的に使用できます。
質問1( cURLは出力がリダイレクトされたときにのみ表を表示する方法を知っている)を参照して、プログラムがその出力が指示されていることを伝えることができるPOSIXシステムには、ファイル記述子が端末を参照しているかどうかを報告する関数 isatty
があります。
1)特定の種類のリダイレクトでのみ表示されるのはどうしてですか?
curlのmanページから
HTTP POSTまたはPUT要求の進行状況メーターが必要な場合は、シェルのリダイレクト(>)、-o [file]などを使用して応答出力をファイルにリダイレクトする必要があります。
curlはリダイレクトを決定するために isatty を使用しなければならず、ファイルまたはシェルパイプにリダイレクトされたときにプログレスメーターを表示します。
2)それを抑制する最も良い方法は何ですか?
curlのmanページから
- s、 - silent
サイレントモードまたはクワイエットモード。プログレスメーターやエラーメッセージを表示しません。カールをミュートにします。あなたがそれをリダイレクトしない限り、それはまだあなたが要求するデータを、潜在的にさえ端末/標準出力に出力します。
本当のエラーメッセージをどこかに置くためには、ログファイルにstrerrを書くべきです。そんな感じ:
curl "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
プロキシの後ろにいるので、私はこのようなコマンドを使います。
date -s "$(curl --proxy http:// PROXY:8080 -s http:// google.com --head -s | grep Date | sed '/ Date:// g') "