当我卷曲一个太长的 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 curl
了sudo apt install curl
。
怎样才能消除故障?到目前为止,我什么都没做,它已经运行良好了。这是错误吗?
答案1
找到解决方法
我能够curl: (23) Failure writing output to destination
使用以下命令行来抑制错误消息:
RESPONSE=$(curl http://httpstat.us/502); head -n 1 <<< $RESPONSE
详细步骤
- 告诉
curl
将完整内容写入变量(这可以防止 curl 出现错误消息)。如果您愿意,您也可以在此步骤之后检查错误代码。 - 转发变量到
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
对该文件执行操作。