在管道传输到“head”/“tail”之后:“curl: (23) 无法将输出写入目标”

在管道传输到“head”/“tail”之后:“curl: (23) 无法将输出写入目标”

当我卷曲一个太长的 API 调用并只想在控制台中显示前 30 行时curl my_api_call|head -30,我遇到了:

 24 49931   24 12089    0     0    98k      0 --:--:-- --:--:-- --:--:--   99k
curl: (23) Failure writing output to destination

这肯定和curl:(23)将输出写入目标失败,但在那里,下载失败。在这里,它在管道传输到“head”/“tail”后立即失败。管道本身仍然有效,我得到了 30 行。如果我取出管道,就不会出现故障。

另一个问题的答案对我没有帮助,我跑sudo apt remove curlsudo apt install curl

怎样才能消除故障?到目前为止,我什么都没做,它已经运行良好了。这是错误吗?

答案1

找到解决方法

我能够curl: (23) Failure writing output to destination使用以下命令行来抑制错误消息:

RESPONSE=$(curl http://httpstat.us/502); head -n 1 <<< $RESPONSE

详细步骤

  1. 告诉curl将完整内容写入变量(这可以防止 curl 出现错误消息)。如果您愿意,您也可以在此步骤之后检查错误代码。
  2. 转发变量到head

答案2

根据我的分析,如果 head 命令截断了一些数据或者它可以显示完整的结果,那么错误可能是合理的。

我检查了curl http://www.google.com | head -n 10 && echo "Success" || echo Failure(=部分内容) 和curl http://www.google.com | head -n 1000 && echo "Success" || echo Failure(=全部内容),curl: (23) Failure writing output to destination在 10 行版本中总是出现这种情况。1000 行版本始终不会出现此错误消息。

有趣的是,我的测试在两种情况下都显示“成功”。最后也(curl http://www.google.com | head -n 10); echo $?总是显示错误代码。但是:我的 GitLab 管道以某种方式检测到此命令失败并显示我的 gitlab-job 失败。0

答案3

好吧,curl 显然会检查它是否无法写入标准输出。

$ man curl输入/^ +-S并按回车键,然后阅读几行,你就会找到一个可能对你有用的选项。(即--silent

如果您仍希望看到前 30 行;将输出重定向到 /tmp/ 中的文件,然后head -n 30对该文件执行操作。

相关内容