这里有一些很好的答案,但就像我发现自己想要的 OP,在脚本上下文中,所有的:
- 服务器返回的任何响应正文,无论响应状态码如何:某些服务将发送错误详细信息,例如响应为错误时以 JSON 形式显示
- HTTP 响应代码
-
curl 退出状态码
这很难通过单个 curl 调用来实现,我正在寻找一个完整的解决方案/示例,因为所需的处理很复杂。
我将其他一些关于多路复用 stdout/stderr/return-code 的 bash 配方与此处的一些想法结合起来,得出以下示例:
{
IFS= read -rd '' out
IFS= read -rd '' http_code
IFS= read -rd '' status
} < <({ out=$(curl -sSL -o /dev/stderr -w "%{http_code}" 'https://httpbin.org/json'); } 2>&1; printf '\0%s' "$out" "$?")
然后可以在变量中找到结果:
echo out $out
echo http_code $http_code
echo status $status
结果:
out { "slideshow": { "author": "Yours Truly", "date": "date of publication", "slides": [ { "title": "Wake up to WonderWidgets!", "type": "all" }, { "items": [ "Why <em>WonderWidgets</em> are great", "Who <em>buys</em> WonderWidgets" ], "title": "Overview", "type": "all" } ], "title": "Sample Slide Show" } }
http_code 200
status 0
该脚本通过多路复用输出、HTTP 响应代码和由空字符分隔的curl 退出状态来工作,然后将它们读回当前的 shell/脚本。它可以使用curl 请求进行测试,该请求将返回 >=400 响应代码但也会产生输出。
请注意,如果没有-f 标志,curl 在服务器返回异常HTTP 响应码即>=400 时不会返回非零错误码,而使用-f 标志,服务器输出将被抑制发生错误时,使用此标志进行错误检测和处理没有吸引力。
使用 IFS 处理的通用 read 的学分转到此答案:https://unix.stackexchange.com/a/430182/45479。