単一のツールとして大丈夫です:
curl "someURL"
curl -o - "someURL"
しかし、パイプラインでは機能しません:
curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'
それは返します:
(23) Failed writing body
カール出力のパイピングの問題は何ですか?カール出力全体をバッファリングしてから処理する方法は?
これは、前のプログラムがページ全体の書き込みを終了する前に、パイプ処理されたプログラム(grepなど)が読み取りパイプを閉じると発生します。
curl "url" | grep -qs foo
では、grepが必要なものを取得するとすぐに、curlからの読み取りストリームを閉じます。 cURLはこれを予期せず、「本文の書き込みに失敗しました」エラーを発行します。
回避策は、次のプログラムにフィードする前に常にページ全体を読み取る中間プログラムにストリームをパイプすることです。
例えば。
curl "url" | tac | tac | grep -qs foo
tac
は、入力ページ全体を読み取り、行の順序を逆にする単純なUnixプログラムです(したがって、2回実行します)。最後の行を見つけるために入力全体を読み取る必要があるため、cURLが終了するまでgrepに何も出力しません。 Grepは、探しているものがあれば読み取りストリームを閉じますが、tacにのみ影響し、エラーは発生しません。
(完全性と将来の検索のため)CURLがバッファを管理する方法に関係なく、バッファは-Nオプションで出力ストリームを無効にします。
ES:curl -s -N "URL" | grep -q Welcome
別の可能性として、-o
(出力ファイル)オプションを使用する場合-宛先ディレクトリーが存在しません。
例えば。 -o /tmp/download/abc.txt
があり、/ tmp/downloadが存在しない場合。
したがって、必要なディレクトリが事前に作成/存在していることを確認し、必要に応じて--create-dirs
オプションと-o
を使用します
そのため、エンコードの問題でした。 Iconvは問題を解決します
curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...
-o
オプションを使用する代わりにこれを行うことができます。
curl [url] > [file]
同じエラーが発生しましたが、理由は異なります。私の場合、1GBのスペースしかない(tmpfs)パーティションがあり、そのパーティションで最終的にすべてのメモリを埋めたの大きなファイルをダウンロードしていたので、同じエラーが発生しました。
buntuにニスキャッシュをインストールしようとしているときにこのエラーメッセージが表示されました。Google検索でエラー
(23) Failed writing body
が表示されたため、解決策が投稿されました。
ルートcurl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
としてコマンドを実行中にバグが発生しました
解決策は、apt-key add
を非ルートとして実行することです
curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
私の場合、サーバーはディスク容量を使い果たしました。
df -k .
で確認してください
他の回答のいずれかで説明されているように、tac
を2回パイピングしようとすると、ディスク容量の不足が警告されました: https://stackoverflow.com/a/28879552/336694 。エラーメッセージwrite error: No space left on device
が表示されました。
source <( curl -sS $url )
のような類似したものを試して(23) Failed writing body
エラーを取得している場合、プロセス置換のソースがbash 3.2
(macOSのデフォルト)で機能しないためです。
代わりに、この回避策を使用できます。
source /dev/stdin <<<"$( curl -sS $url )"
私にとっては、許可の問題でした。 Docker runはユーザープロファイルで呼び出されますが、rootはコンテナー内のユーザーです。解決策は、rootだけでなくすべてのユーザーに書き込み許可があるので、curlに/ tmpに書き込むことでした。
-oオプションを使用しました。
-o/tmp/file_to_download