作为一个单独的工具,它工作得很好:
curl "someURL"
curl -o - "someURL"
但这在流水线上行不通:
curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'
它返回:
(23) Failed writing body
管道cURL输出的问题是什么?如何缓冲整个cURL输出,然后处理它?
作为一个单独的工具,它工作得很好:
curl "someURL"
curl -o - "someURL"
但这在流水线上行不通:
curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'
它返回:
(23) Failed writing body
管道cURL输出的问题是什么?如何缓冲整个cURL输出,然后处理它?
当前回答
我在ubuntu上安装清漆缓存时遇到了这个错误信息。谷歌搜索让我在这里的错误(23)失败的写作主体,因此张贴一个解决方案,为我工作。
在以根curl - l https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -的身份运行命令时遇到此错误
解决方案是以非根用户身份运行apt-key add
curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
其他回答
对我来说,这是许可问题。Docker运行是使用用户配置文件调用的,但root是容器内的用户。解决方案是让curl写入/tmp,因为它对所有用户都有写权限,而不仅仅是根用户。
我使用了-o选项。
- o / tmp / file_to_download
就我而言,我在做: Curl <blabla> | jq | grep <blibli>
用jq。它工作:curl <blabla> | jq。| grep <blibli>
当管道程序(例如grep)在前一个程序完成整个页面的写入之前关闭读管道时,就会发生这种情况。
在curl "url" | grep -qs foo中,一旦grep得到它想要的,它就会关闭curl的读取流。cURL没有预料到这一点,并发出“写入正文失败”错误。
一种解决方法是将流通过中间程序输送,该程序总是在将其提供给下一个程序之前读取整个页面。
E.g.
curl "url" | tac | tac | grep -qs foo
tac是一个简单的Unix程序,它读取整个输入页并颠倒行序(因此我们运行了两次)。因为它必须读取整个输入以找到最后一行,所以在cURL完成之前它不会向grep输出任何内容。当Grep得到它要找的东西时,它仍然会关闭读流,但它只会影响tac,而tac不会发出错误。
你可以这样做,而不是使用-o选项:
Curl [url] >[文件]
我得到这个错误试图使用jq时,我没有安装jq。所以…如果您尝试使用jq,请确保已安装jq。