Answers:
curl --fail
做你想要的一部分:
来自man curl
:
-f, --fail
(HTTP)在服务器错误时静默失败(根本没有输出)。这样做主要是为了更好地使脚本等能够更好地处理失败的尝试。在正常情况下,当HTTP服务器无法交付文档时,它会返回一个HTML文档,说明其内容(通常还说明原因以及更多内容)。该标志将阻止curl输出该错误并返回错误22。
此方法不是故障安全的,并且有时会漏掉不成功的响应代码,尤其是在涉及身份验证时(响应代码401和407)。
但是它阻止输出到屏幕。
如果只想显示卷曲页面的内容,则可以执行以下操作:
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)
if test $STATUSCODE -ne 200; then
# error handling
fi
这会将页面的内容写入STDERR,同时将HTTP状态代码写入STDOUT,因此可以将其分配给变量STATUSCODE。
0
脚本返回非状态代码怎么办?
if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi
呢?
{ code=$(curl ... as above ...); } 2>&1
诀窍是{ ... } 2>&1
允许重定向,而不会产生其他shell ( ... )
。
我能够使用组合标志来做到这一点:
curl --silent --show-error --fail URL
--silent隐藏进度和错误
--show-error显示被--silent
--fail隐藏的错误消息,当请求失败时,返回退出代码> 0
--silent --show-error --fail
与正义一样的作品-f/--fail
。
是的,有一种方法可以做到,但远非显而易见,因为它涉及3个curl选项:
curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null
这样可以确保只有在卷曲最终结束并最终2xx
返回代码时才成功(0),并且成功stdout
获取主体,并且任何错误都将显示给stderr。
请注意,curl文档可能会使您有些困惑,因为它提到--fail对于某些401代码可能成功。基于不正确的测试,至少不是与--show-error同时使用时才如此。
到目前为止,我无法找到在没有使用这些选项的http成功的情况下curl将返回成功的任何情况。