为什么cURL返回错误"(23) Failed writing body"?

5 浏览
0 Comments

为什么cURL返回错误"(23) Failed writing body"?

这个工具作为单独的工具运行良好:\n

curl "someURL"
curl -o - "someURL"

\n但是在管道中它无法正常工作:\n

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

\n它会返回:\n

(23) 写入正文失败

\n在管道中使用cURL输出的问题是什么?如何缓冲整个cURL输出然后进行处理?

0
0 Comments

在使用cURL时,如果返回错误"(23) Failed writing body",可能的原因是输出文件的目录不存在。例如,如果使用了"-o"(输出文件)选项,并且目录"/tmp/download"不存在。因此,在需要的目录之前确保已创建/存在,如果需要,可以使用"--create-dirs"选项以及"-o"选项。

感谢"--create-dirs"选项,这个解决方法对我来说非常有效,解决了一个非常奇怪的问题,我一直无法弄清楚出了什么问题,但这是解决办法!

我在类似的情况下也遇到了同样的问题。我忘记为输出声明变量$out。谢谢,Mike。

0
0 Comments

cURL返回错误"(23) Failed writing body"的原因是cURL在处理缓冲区时的问题。缓冲区使用"-N"选项禁用了输出流。

解决方法是使用"-s"选项来使cURL静默,这样就不会显示错误信息。虽然底层问题仍然存在,但大多数情况下这是可以接受的。然而,如果你像这样做:curl ... | tee /tmp/full_output | head -20,那么如果你想要/tmp/full_output包含所有内容,你需要实际解决这个错误。

0
0 Comments

cURL为什么会返回错误“(23)写入body失败”?

当一个管道程序(例如grep)在前一个程序完成写入整个页面之前关闭读取管道时,就会出现这个问题。

在“curl“url” | grep -qs foo”中,一旦grep得到它想要的内容,它就会关闭来自curl的读取流。cURL不希望出现这种情况,所以会出现“写入body失败”的错误。

解决方法是将流通过一个中间程序进行管道传输,该程序总是在将页面传递给下一个程序之前读取整个页面。

例如:

curl “url” | tac | tac | grep -qs foo

tac是一个简单的Unix程序,它读取整个输入页面并反转行的顺序(因此我们运行它两次)。因为它必须读取整个输入以找到最后一行,所以在cURL完成之前它不会向grep输出任何内容。当grep得到它想要的内容时,它仍然会关闭读取流,但这只会影响到tac,而不会引发错误。

你不可以简单地通过cat来进行管道传输吗?至少对我来说可以解决问题。

不行。对于太大而无法适应缓冲区的文档,cat使用的错误将重新出现。如果你不需要错误消息(和进度),可以使用-s来静音。

tac | tac会改变输入,如果输入不以换行符结束,或者例如printf a\\nb\\nc | tac | tac会打印a\ncb,其中\n是换行符。你可以使用sponge /dev/stdout来代替。另一个选项是printf %s\\n "$(cat)",但是当输入在除了Zsh之外的shell中包含空字节时,它要么跳过空字节,要么在第一个空字节后停止读取。

从文档中可以看到:CURLE_WRITE_ERROR(23)在将接收到的数据写入本地文件时发生错误,或者从写回调函数返回错误给libcurl。

这是被接受的答案,因为它解释了问题,尽管它没有提供有效的解决方案,因为macOS上没有tac命令。

我只是忽略stderr并将其发送到null:curl “url” 2>/dev/null | grep

这看起来很丑陋,但对于调查来说很有用;它可以让你看到真正的错误,比如你正在管道传输的命令没有安装。然后你可以移除tac|tac。

0