作为一个单独的工具,它工作得很好:
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输出,然后处理它?
当前回答
用sudo尝试命令对我有用。例如:
sudo curl -O -k 'https url here'
注意:-O(这是大写o,不是零)& -k https url。
其他回答
I was getting curl:(23)写作体不及格。后来我注意到我没有足够的空间通过curl下载rpm包,这就是我得到问题的原因。我腾出了一些空间和问题来解决。
在Bash和zsh(也许还有其他shell)中,您可以使用进程替换(Bash/zsh)动态地创建一个文件,然后将该文件作为管道链中下一个进程的输入。
例如,我试图用jq和更少的方法从cURL解析JSON输出,但得到了失败的写入正文错误。
# Note: this does NOT work
curl https://gitlab.com/api/v4/projects/ | jq | less
当我用过程替换重写它时,它起作用了!
# this works!
jq "" <(curl https://gitlab.com/api/v4/projects/) | less
注意:jq使用它的第二个参数指定一个输入文件
额外的好处:如果你像我一样使用jq,并且想让彩色输出更少,可以使用下面的命令行:
jq -C "" <(curl https://gitlab.com/api/v4/projects/) | less -r
(感谢Kowaru解释了为什么会出现失败的写作体。然而,他们使用两次战术的解决方案对我不起作用。我还想找到一种解决方案,可以更好地扩展大文件,并尽量避免注释中提到的其他问题。)
因为我自己的打字错误,我也有同样的问题:
# fails because of reasons mentioned above
curl -I -fail https://www.google.com | echo $?
curl: (23) Failed writing body
# success
curl -I -fail https://www.google.com || echo $?
@Kaworu的解释很棒:https://stackoverflow.com/a/28879552/198219
当管道程序(例如grep)在前一个程序完成整个页面的写入之前关闭读管道时,就会发生这种情况。cURL没有预料到这一点,并发出“写入正文失败”错误。
一种解决方法是将流通过中间程序输送,该程序总是在将其提供给下一个程序之前读取整个页面。
我认为更正确的做法是使用海绵,就像@nisetama在评论中建议的那样:
Curl "url" |海绵| grep -qs foo
对于完整性和将来的搜索:
这取决于cURL如何管理缓冲区,缓冲区使用-N选项禁用输出流。
例子: curl -s -N "URL" | grep -q欢迎