209

単一のツールとして問題なく動作します。

curl "someURL"
curl -o - "someURL"

しかし、パイプラインでは機能しません:

curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'

それは返します:

(23) Failed writing body

cURL 出力をパイプする際の問題は何ですか? cURL出力全体をバッファリングして処理する方法は?

4

14 に答える 14

150

これは、パイプ処理されたプログラム (grep など) が、前のプログラムがページ全体の書き込みを完了する前に読み取りパイプを閉じた場合に発生します。

ではcurl "url" | grep -qs foo、grep が必要なものを取得するとすぐに、curl からの読み取りストリームを閉じます。cURL はこれを想定しておらず、「本文の書き込みに失敗しました」というエラーを出力します。

回避策は、次のプログラムに渡す前に常にページ全体を読み取る中間プログラムを介してストリームをパイプすることです。

例えば

curl "url" | tac | tac | grep -qs foo

tacは、入力ページ全体を読み取り、行の順序を逆にする単純な Unix プログラムです (したがって、2 回実行します)。最後の行を見つけるために入力全体を読み取る必要があるため、cURL が完了するまで何も出力しません。grep は、探しているものがあれば読み取りストリームを閉じますが、tac にのみ影響し、エラーは発生しません。

于 2015-03-05T13:58:14.197 に答える
4

コマンドを試してみるとsudoうまくいきました。例えば:

sudo curl -O -k 'https url here'

注: -O (これは大文字の o であり、ゼロではありません) & -k (https url の場合)。

于 2021-09-26T02:32:49.460 に答える