为什么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的空间,我正在下载大文件,最后填满了该分区上的所有内存 ,我得到了同样的错误。