它作为一个工具工作得很好:
curl "someURL"
curl -o - "someURL"
但它不能在管道中工作:
curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'
它返回:
(23) Failed writing body
通过管道传输cURL输出有什么问题?如何缓冲整个cURL输出,然后进行处理?
发布于 2015-03-05 21:58:14
当管道程序(例如grep)在前一个程序完成对整个页面的写入之前关闭读取管道时,就会发生这种情况。
在curl "url" | grep -qs foo
中,一旦grep得到了它想要的东西,它就会关闭从curl读取的流。cURL没有预料到这一点,并发出“写入正文失败”错误。
一种解决方法是通过一个中间程序来传输流,该中间程序总是在将整个页面提供给下一个程序之前读取整个页面。
例如。
curl "url" | tac | tac | grep -qs foo
tac
是一个简单的Unix程序,它读取整个输入页面并颠倒行序(因此我们运行它两次)。因为它必须读取整个输入才能找到最后一行,所以在cURL完成之前,它不会向grep输出任何内容。Grep仍然会关闭读取流,但它只会影响tac,tac不会发出错误。
发布于 2016-02-23 21:36:26
对于完整性和将来的搜索:
这是cURL如何管理缓冲区的问题,缓冲区使用-N选项禁用输出流。
示例:curl -s -N "URL" | grep -q Welcome
发布于 2018-01-24 18:46:17
另一种可能是,如果使用-o
(输出文件)选项,则目标目录不存在。
例如:如果您有-o /tmp/download/abc.txt
,并且/tmp/下载不存在。
因此,请确保预先创建/存在任何所需的目录,如有必要,请使用--create-dirs
选项和-o
https://stackoverflow.com/questions/16703647
复制相似问题