提问者:小点点

为什么cURL返回错误“(23)写入正文失败”?


它作为单个工具正常工作:

curl "someURL"
curl -o - "someURL"

但它在管道中不起作用:

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

它返回:

(23) Failed writing body

管道化卷曲输出有什么问题?如何缓冲整个cURL输出,然后处理它?


共3个答案

匿名用户

当管道程序(例如grep)在上一个程序完成整个页面的写入之前关闭读取管道时,就会发生这种情况。

curl“url”| grep-qs foo中,一旦grep得到了它想要的内容,它就会关闭curl的读取流。cURL没有预料到这一点,并发出“编写主体失败”错误。

一种解决方法是将流通过中介程序输送,中介程序总是在将整个页面馈送到下一个程序之前读取整个页面。

例如。

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

tac是一个简单的Unix程序,它读取整个输入页面并反转行顺序(因此我们运行了两次)。因为它必须读取整个输入才能找到最后一行,所以在cURL完成之前,它不会向grep输出任何内容。Grep仍然会关闭读取流,但它只会影响tac,而tac不会发出错误。

匿名用户

完整性和未来搜索:

这是cURL如何管理缓冲区的问题,缓冲区使用-N选项禁用输出流。

示例:curl-s-N"URL"|grep-q欢迎

匿名用户

另一种可能性是,如果使用-o(输出文件)选项-目标目录不存在。

如果你有-o /tmp/download/abc.txt并且 /tmp/download不存在。

因此,确保预先创建/存在任何必需的目录,如有必要,使用--create dirs选项以及-o