何らかの理由で、2>、>、|のいずれでリダイレクトするかに関係なく、出力は常に端末に出力されます。これを回避する方法はありますか?なぜこうなった?
-s
(サイレント)オプションを追加して進行状況メーターを削除し、stderrをstdoutにリダイレクトして、応答本文と同じfdで詳細な出力を取得します
curl -vs google.com 2>&1 | less
URLにはおそらくアンパサンドが含まれています。私もこの問題を抱えていましたが、URLにはアンパサンド(渡されるCGI変数から)がいっぱいであるため、すべてが奇妙な方法でバックグラウンドに送信され、適切にリダイレクトされないことがわかりました。 URLを引用符で囲むと、修正されます。
上記の答えは私にはうまくいきませんでしたが、最終的にこの構文になりました:
curl https://${URL} &> /dev/stdout | tee -a ${LOG}
teeは出力を画面に表示しますが、ログにも追加します。
ファイルに出力が必要な場合、リダイレクトを使用できます。
curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1
>curl-output.txt
と2>&1
を反転させないでください。これらは bashのリダイレクト動作 が原因で機能しません。
同じことがわかりました。curl自体はSTDOUTに出力されますが、別のプログラムにパイプすることはできません。
最初は、xargsを使用して最初に出力をエコーすることで解決したと思っていました。
curl -s ... <url> | xargs -0 echo | ...
ただし、コメントで指摘されているように、xargs部分がなくても機能するため、-s
(サイレントモード)がSTDOUTへの無関係な進行出力を防ぐための鍵になります。
curl -s ... <url> | Perl -ne 'print $1 if /<sometag>([^<]+)/'
上記の例は、curlステートメントのXML出力から単純な<sometag>
コンテンツ(埋め込みタグを含まない)を取得します。
次は私のために働いた:
abc.sh
という名前のスクリプトにcurlステートメントを入れます
今実行してください:
sh abc.sh 1>stdout_output 2>stderr_output
Curlの結果はstdout_output
で、進捗情報はstderr_output
で取得できます。
この簡単な例は、カール出力をキャプチャし、bashスクリプトで使用する方法を示しています
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