2013-05-23 121 views
59

それは、単一のツールとして、[OK]を動作します:それは返すCURLが返され、エラーが発生する理由(23)本文の作成に失敗しましたか?

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

で問題は何
(23) Failed writing body 

curl "someURL" 
curl -o - "someURL" 

が、それはパイプラインでは動作しません。カール出力を配管しますか?どのようにカールの出力全体をバッファリングし、それを処理するのですか?

+1

私のためには、バッファリングする必要はありません。 – hek2mgl

+0

これもパイプラインで動作しますか?: 'curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | tr -d '\ n "\ – static

+0

はい、もちろん..あなたのURLでテストしました – hek2mgl

答えて

9

これはエンコードの問題でした。 iconvのはあなたではなく-oオプションを使用するのでこれを行うことができ、問題

curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ... 
3

を解決:

curl [url] > [file]

+0

パイプを使用せず、代わりにファイルシステム全体の作業を行いますか?私はカールの出力をパイプで使いたいと思っていました。 – static

+2

質問によると、パイプシーケンスは機能しません。 – Det

45

前のプログラムが終了する前に、パイプで連結されたプログラム(例えばgrepのは)読み取りパイプを閉じたときに発生しますページ全体を書く。

curl "url" | grep -qs fooでは、grepが望むようになるとすぐに、カールからの読み取りストリームを閉じます。 cURLはこれを期待せず、 "Failed writing body"エラーを発行します。

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

など。

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

tac全体入力ページを読み込み、行の順序を(それゆえ、我々はそれを2回実行します)反転簡単なUnixのプログラムです。最後の行を見つけるためには入力全体を読み取る必要があるため、cURLが終了するまでgrepに何も出力しません。 Grepは、それが探しているものがあるときには読み込みストリームを閉じますが、エラーを出さないtacにのみ影響します。

+1

単に 'cat'を通してそれをパイプで渡すことはできませんか?私の問題を少なくとも解決します。 – benvd

+3

いいえ小さな書類では助けになるかもしれませんが、バッファーcatに収まる大きすぎる場合はエラーが再現されます。 '-s'を使うと、必要ない場合にはすべてのエラーメッセージを消すことができます。 – Kaworu

+2

'tac | tac'は、入力が改行で終わっていない場合、あるいは' printf a \\ nb \\ nc | tac | tac'は '\ ncb'を出力します。' \ n'は改行です。代わりに 'sponge/dev/stdout'を使うことができます。別のオプションは 'printf%s \\ n" $(cat) "'ですが、入力がZsh以外のシェルでnullバイトを含んでいる場合、nullバイトをスキップするか、最初のヌルバイトの後に読み込みを停止します。 – user4669748

7

CURLがバッファをどのように管理するかという点で、バッファは-Nオプションを使用して出力ストリームを無効にします。

ES: curl -s -N "URL" | grep -q Welcome

+1

は動作しません。 –

+4

それは*働きます!ありがとう! –

+1

これは 'curl -s https://raw.githubusercontent.com/hermitdave/FrequencyWords/master/content/2016/ro/ro_50k.txt | head -20'( '-s'を付けないと同じエラーが出ます)。 –

4

私は同じエラーがあったが、さまざまな理由から。私の場合は、1GBのスペースしか持たない(tmpfs)パーティションがあり、最終的にはという大きなファイルをダウンロードしていたので、そのパーティションのすべてのメモリがで満たされました。

1

-o(出力ファイル)オプションを使用すると、別の可能性があります。宛先ディレクトリは存在しません。

例えば、 -o /tmp/download/abc.txtがあり、/ tmp/downloadが存在しない場合は、同様に--create-dirsオプションを使用したがって

、任意の必要なディレクトリが作成/されるよう、事前に存在し、 - o必要

1

あればUbuntuの上ニスキャッシュをインストールしようとしているときに、私はこのエラーメッセージに遭遇しました。 Googleの検索でエラー(23) Failed writing bodyが表示されたので、私にとってうまくいきました。 curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -

ソリューションは、rootとしてコマンドを実行中にバグが発生した

は、私の場合には、非ルート

curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add - 
0

サーバーのディスク容量を使い果たしたとしてapt-key addを実行することです。 https://stackoverflow.com/a/28879552/336694:私は二回tacて配管をしようとしたときに他の回答の1で説明したように、私は、ディスク・スペースの不足に警告されたdf -k .

とそのための

チェック。それは私にエラーメッセージwrite error: No space left on deviceを示しました。

関連する問題