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

curl "someURL"
curl -o - "someURL"

但这在流水线上行不通:

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

它返回:

(23) Failed writing body

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


当前回答

所以这是编码的问题。Iconv解决了这个问题

curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...

其他回答

另一种可能是,如果使用-o(输出文件)选项,目标目录不存在。

如。如果你有-o /tmp/download/abc.txt且/tmp/download不存在。

因此,确保任何需要的目录都是预先创建/存在的,使用——create-dirs选项,必要时使用-o

所以这是编码的问题。Iconv解决了这个问题

curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...

我得到这个错误试图使用jq时,我没有安装jq。所以…如果您尝试使用jq,请确保已安装jq。

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

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

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

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

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

你可以这样做,而不是使用-o选项:

Curl [url] >[文件]