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


117

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


3
実行するcurl -v url 2>&1と、エラーは標準出力に正しくリダイレ​​クトされます。
ジョシュリー

回答:


134

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

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

3
これはほとんどのWebサイトで機能しますが、 `2>&1 |を実行しても、何らかの理由で私のマシンのローカルサーバーが完全な出力を印刷します。grep asdfasdfasdfasdfdfs`またはそのようなもの。ヘッダーを含む完全な出力は引き続きコンソールに表示されます。必要なデータを抽出するためにgrepにパイプ処理できる他のストリームはありますか?
ジョンデリー

どの情報を実際に抽出しようとしているか、どの情報を破棄したいか。私はあなたの質問があなたが-vのすべての出力をstdoutに向けて欲しいことを意味すると理解した。
SingleNegationElimination 2011年

一部のCookieを処理したい(基本的には、Cookieからいくつかの情報をgrepし、他の処理を実行する)。はい、すべてを標準出力にしたいので、パイプを介して何でも処理できます。現在、一部の出力はコンソールに表示されるだけで、リダイレクトすることは不可能と思われ、その理由はわかりません。
ジョンデリー

キャプチャしたい画面に表示される出力のスクリーンショットを投稿できますか?によって見落とされている可能性のある出力がどのような種類の出力であるかはわかりません2>&1
SingleNegationElimination 2011年

他のWebサイトと同じタイプの出力です。唯一の違いは、サーバーがローカルで実行されていることです。プログラムがコンソールに出力する方法はありますが、そのテキストがstout / sterrによってキャプチャされないようにする方法はありますか?
ジョンデリー

115

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


1
私も同じ問題を抱えていました。2>&1は必要ないので、出力と接続ログを分離しておくことができます。ありがとうございました。
Quornianの

3
Stack-Oが大好き...このqが見つかりました。URLにアンパサンドが含まれています。それは私の周りに引用を置き、問題は解決しました。
Paulb 2014年

2
引用符は私のためにトリックをしました。curlが他のスレッドで実行されているように感じました。どうもありがとう !
vdolez 2015年

1
あなたが私の夜を保存する前に、5分間ウェブで検索しなければなりません
でした

イエス様、カールのひどいバグです。少なくとも、失敗するか警告を出す必要があります。あなたの2012年の回答は2018年に私を助けました。私があなたの回答に出会うまで、これを解決するのに30分かかりました。ありがとうございました!
Mauvis Ledford 2018

29

上記の答えは私にはうまくいきませんでした、結局何がこの構文でしたか:

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

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


1
&> /dev/stdout間違いなく欠けていた部分でした、ありがとう
mattspain

10

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

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

>curl-output.txtとを反転させないように注意してください2>&1。これは、bashのリダイレクト動作のために機能しません。


3

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

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

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

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

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

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


2
あなたの例では「xargs -0 echo |」不要です。'curl -s'がある限り、出力を別のプログラムにパイプすることができます。
Ryan Horrisberger 2013

1

ちょうど私の2セント。以前に答えたように、以下のコマンドでうまくいくはずです

curl -vs google.com 2>&1

ただし、出力をファイルに取得する必要がある場合は、

curl -vs google.com > out.txt 2>&1

うまくいくはずです。


1
これは、2011年の承認された回答に本当の価値を追加しません。どちらかと言えば、これはその回答へのコメントである可能性があります。
トリンコット

0

以下は私のために働きました:

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

今実行します:

sh abc.sh 1>stdout_output 2>stderr_output

curlの結果stdout_outputとの進行情報がに表示されstderr_outputます。


0

この簡単な例は、curl出力をキャプチャし、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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.