作为一个单独的工具,它工作得很好:

curl "someURL"
curl -o - "someURL"

但这在流水线上行不通:

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

它返回:

(23) Failed writing body

管道cURL输出的问题是什么?如何缓冲整个cURL输出,然后处理它?


当前回答

在我的情况下,服务器耗尽了磁盘空间。

用df -k检查它。

当我尝试两次通过tac进行管道处理时,我被提醒磁盘空间不足,如另一个答案:https://stackoverflow.com/a/28879552/336694中所描述的那样。它向我显示了错误消息写错误:设备上没有剩余空间。

其他回答

在我的情况下,服务器耗尽了磁盘空间。

用df -k检查它。

当我尝试两次通过tac进行管道处理时,我被提醒磁盘空间不足,如另一个答案:https://stackoverflow.com/a/28879552/336694中所描述的那样。它向我显示了错误消息写错误:设备上没有剩余空间。

因为我自己的打字错误,我也有同样的问题:

# 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 $?

如果你正在尝试类似source <(curl -sS $url)这样的东西,并得到(23)Failed writing body错误,这是因为在bash 3.2 (macOS的默认)中,源进程替换不起作用。

相反,您可以使用这个解决方案。

source /dev/stdin <<<"$( curl -sS $url )"

就我而言,我在做: Curl <blabla> | jq | grep <blibli>

用jq。它工作:curl <blabla> | jq。| grep <blibli>

@Kaworu的解释很棒:https://stackoverflow.com/a/28879552/198219

当管道程序(例如grep)在前一个程序完成整个页面的写入之前关闭读管道时,就会发生这种情况。cURL没有预料到这一点,并发出“写入正文失败”错误。

一种解决方法是将流通过中间程序输送,该程序总是在将其提供给下一个程序之前读取整个页面。

我认为更正确的做法是使用海绵,就像@nisetama在评论中建议的那样:

Curl "url" |海绵| grep -qs foo