为什么CURL返回和错误(23)写体失败?
它可以作为一个单一的工具:
curl "someURL" curl -o - "someURL"
但它不能在pipe道中工作:
curl "someURL" | tr -d '\n' curl -o - "someURL" | tr -d '\n'
它返回:
(23) Failed writing body
pipe道curl输出有什么问题? 如何缓冲整个curl输出,然后处理它?
当一个pipe道程序(例如grep)在前一个程序写完整个页面之前closures了读取pipe道时,会发生这种情况。
curl "url" | grep -qs foo
curl "url" | grep -qs foo
,只要grep有它想要的就会closures从curl读取的stream。 cURL不期望这个,并发出“失败的写体”错误。
解决方法是通过一个中介程序来pipe理stream,该中介程序在将其提供给下一个程序之前总是读取整个页面。
例如
curl "url" | tac | tac | grep -qs foo
tac
是一个简单的Unix程序,它读取整个input页面并反转行顺序(因此我们运行两次)。 因为它必须读取整个input以查找最后一行,所以在cURL结束之前,不会输出任何内容到grep。 当它有它正在寻找的内容时,Grep仍然会closures阅读stream,但它只会影响tac,而不会发出错误。
所以这是一个编码问题。 Iconv解决了这个问题
curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...
(为了完整性和未来的search)CURL如何pipe理缓冲区,缓冲区使用-N选项禁用输出stream。
ES: curl -s -N "URL" | grep -q Welcome
curl -s -N "URL" | grep -q Welcome
你可以这样做,而不是使用-o
选项:
curl [url] > [file]
我有同样的错误,但从不同的原因。 在我的情况下,我有(tmpfs)分区只有1GB的空间,我正在下载大文件,最后填满了该分区上的所有内存 ,我得到了同样的错误。