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


60

stderrbashシェルからcURLリクエストの詳細セクション(に送信される)のみを印刷しようとしています。

しかし、私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)それを抑制する最も近い方法は何ですか?

ありがとうございました

回答:


55

これを試して:

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

これにより、進行状況メーターが抑制され、に送信stdout/dev/nullれてstderr-v出力)がリダイレクトされstdoutます。


31
おかげで-s、鍵となりました!
イアンマッキノン

6
@IanMackinnonありで-sもなし-vでも、接続の失敗などのエラーは表示されないことに注意してください。そのためには、mhoydisの答えのように追加-S(または--show-error)する必要があります。
アルチョーム

しかし、リダイレクト時にプログレスバーが最初にしか表示されないのはなぜですか?curlto の出力をパイプするときにこの同じ問題に遭遇しましたjq。配管なしませプログレスバーjqその後、への配管jq私は戻って、追加する必要がありません-s
sixty4bit

@ sixty4bit:これは、開発者が行った設計上の選択です。プログラムはSTDOUT、ttyではないことを検出できます。出力がパイプ処理されていない場合、進行状況情報を通常の出力に散らばらせたくないので、それを確認して進行状況を把握できます。出力がリダイレクトまたはパイプされると、表示されないため、進行状況を示すゲージがありません-進行状況バーがオンになっていない限り。
デニスウィリアムソン

20
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(この場合はファイル)にリダイレクトします。


5

によると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交換可能に使用できます。


4

質問1を参照すると(どのように、私は、その出力を言うことができるプログラムが向けられていた実現しなかったカールは、出力がリダイレクトされた場合にのみ、テーブルを表示するために知っている)が、関数であり、POSIXシステム上思えるisattyかどうかを報告しますファイル記述子は端末を指します。


2
ここではバッシュの抜粋です:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
デニスウィリアムソン

2

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

curlのmanページから

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

curlはisattyを使用してリダイレクトを決定し、ファイルまたはシェルパイプにリダイレクトされたときに進行状況メーターを出力する必要があります。

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

curlのmanページから

-s、-サイレント

サイレントモードまたはクワイエットモード。進行状況メーターやエラーメッセージを表示しません。Curlをミュートにします。リダイレクトしない限り、潜在的に端末/ stdoutに、要求されたデータを出力します。


1

実際のエラーメッセージをどこかに置くには、ログファイルにstrerrを書き込む必要があります。そんな感じ:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.