私は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
Table appears:
curl -v http://somehost/somepage 2>&1 | cat
1) なぜこれが特定のタイプのリダイレクトでしか表示されないのですか?
2)一番すっきりと抑える方法は?
Thank you
74 Ian Mackinnon 2010-08-07
Try this:
curl -vs -o /dev/null http://somehost/somepage 2>&1
これでプログレスメーターが抑制され、stdout
を/dev/null
に送り、stderr
(-v
の出力)をstdout
にリダイレクトします
67 Paused until further notice. 2010-08-07
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'
最後に2>&1を追加するだけで、STDERRをSTDOUT(この場合はファイル)にリダイレクトすることができます
27 mhoydis 2013-12-26
man curl
によると
-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.
Example usage:
curl -s 'http://www.google.com'
または、HTTP-BODYをbashの変数に取得したい場合
BODY=$( curl -s 'http://www.google.com' )
echo $BODY
-s
と--silent
を入れ替えて使うことができます
6 Venkatt Guhesan 2016-09-20
質問1(出力がリダイレクトされたときにのみテーブルを表示することをcURLがどのように知っているか)を参照して、プログラムがその出力がリダイレクトされていることを伝えることができるとは知りませんでしたが、POSIXシステムでは、ファイル記述子がターミナルを参照しているかどうかを報告する関数isatty
があるようです
5 Ian Mackinnon 2010-08-07
1) なぜこれが特定のタイプのリダイレクトでしか表示されないのですか?
カールマンのページから
HTTP POST や PUT リクエストのプログレスメータが必要な場合は、シェルリダイレクト (>) や -o [file] などを使用して、レスポンス出力をファイルにリダイレクトする必要があります
curl は isatty を使用してリダイレクトを決定し、ファイルやシェルパイプにリダイレクトされたときにプログレスメーターを表示する必要があります
2)一番すっきりと抑える方法は?
カールマンのページから
-s, –silent
サイレントまたは静音モード。プログレスメーターやエラーメッセージを表示しません。Curl をミュートにします。リダイレクトしない限り、要求されたデータは出力され、潜在的にはターミナル/stdoutにも出力されます
2 Wyrmwood 2017-01-04
本当のエラーメッセージをどこかに載せるには、ログファイルに strerr を書くべきです。そんな感じで
curl "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
1 user1065951 2012-07-10
最近のバージョンの curl
には、参照しているプログレスメーターのみを無効にする --no-progress-meter
というオプションが追加されました
1 Michael Hampton 2020-07-17
プロキシの後ろにいる私は、このようなコマンドを使用しています
date -s “$(curl –proxy http://PROXY:8080 -s http://google.com –head -s |grep Date|sed ‘s/Date.//g’)”
0 VeggieVampire 2017-07-07