web-dev-qa-db-ja.com

curl -vの出力をパイプまたはリダイレクトするにはどうすればよいですか?

何らかの理由で、2>、>、|のいずれでリダイレクトするかに関係なく、出力は常に端末に出力されます。これを回避する方法はありますか?なぜこうなった?

101
jonderry

-s(サイレント)オプションを追加して進行状況メーターを削除し、stderrをstdoutにリダイレクトして、応答本文と同じfdで詳細な出力を取得します

curl -vs google.com 2>&1 | less

URLにはおそらくアンパサンドが含まれています。私もこの問題を抱えていましたが、URLにはアンパサンド(渡されるCGI変数から)がいっぱいであるため、すべてが奇妙な方法でバックグラウンドに送信され、適切にリダイレクトされないことがわかりました。 URLを引用符で囲むと、修正されます。

103
roadnottaken

上記の答えは私にはうまくいきませんでしたが、最終的にこの構文になりました:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

teeは出力を画面に表示しますが、ログにも追加します。

24
Amir Mehler

ファイルに出力が必要な場合、リダイレクトを使用できます。

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

>curl-output.txt2>&1を反転させないでください。これらは bashのリダイレクト動作 が原因で機能しません。

5
panepeter

同じことがわかりました。curl自体はSTDOUTに出力されますが、別のプログラムにパイプすることはできません。

最初は、xargsを使用して最初に出力をエコーすることで解決したと思っていました。

curl -s ... <url> | xargs -0 echo | ...

ただし、コメントで指摘されているように、xargs部分がなくても機能するため、-s(サイレントモード)がSTDOUTへの無関係な進行出力を防ぐための鍵になります。

curl -s ... <url> | Perl  -ne 'print $1 if /<sometag>([^<]+)/'

上記の例は、curlステートメントのXML出力から単純な<sometag>コンテンツ(埋め込みタグを含まない)を取得します。

3
Brent Faust

次は私のために働いた:

abc.shという名前のスクリプトにcurlステートメントを入れます

今実行してください:

sh abc.sh 1>stdout_output 2>stderr_output

Curlの結果はstdout_outputで、進捗情報はstderr_outputで取得できます。

0
amit

この簡単な例は、カール出力をキャプチャし、bashスクリプトで使用する方法を示しています

test.sh

function main
{
  \curl -vs 'http://google.com'  2>&1
  # note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file. 
}

# capture output of curl to a variable
OUT=$(main)

# search output for something using grep.
echo
echo "$OUT" | grep 302 
echo
echo "$OUT" | grep title 
0
Brad Parks