bash – cURL: リダイレクト時の奇妙な出力を抑制するには?

bash curl pipe redirection stderr

私は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


タイトルとURLをコピーしました