它作为单个工具正常工作:
curl "someURL"
curl -o - "someURL"
但它在管道中不起作用:
curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'
它返回:
(23) Failed writing body
管道化卷曲输出有什么问题?如何缓冲整个cURL输出,然后处理它?
当管道程序(例如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