題 如果HTTP狀態代碼不是200,我可以使用不同於0的exitCode使cURL失敗嗎?


我總是假設當curl得到一個HTTP 500響應它返回一個退出代碼意味著失敗(!= 0),但這似乎是  案子。

如果HTTP狀態代碼不是200,我是否可以使用不同於0的exitCode使cURL失敗?我知道我可以用 -w "%{http_code}" 但它把它放在STDOUT中,而不是退出代碼(此外,我也有興趣捕獲輸出,我不想重定向到文件,而是重定向到屏幕)。


170
2018-05-01 12:37


起源




答案:


curl --fail 做你想要的一部分:

man curl

-f, --fail

(HTTP)服務器錯誤無提示失敗(根本沒有輸出)。這主要是為了更好地啟用腳本等以更好地處理失敗的嘗試。在正常情況下,當HTTP服務器無法傳遞文檔時,它會返回一個HTML文檔(通常也會描述原因和更多)。該標誌將阻止捲曲輸出並返回錯誤22。

該方法不是故障安全的,並且存在非成功的響應代碼將會漏掉的情況,尤其是涉及認證時(響應代碼401和407)。

但它會阻止輸出到屏幕。


191
2017-10-10 18:36



那麼它的哪些部分做了而不做呢? - rogerdpack
@rogerdpack tl; dr它在檢測到錯誤響應時返回非零值,但它不會讓OP捕獲響應 - rampion
這不會捕獲HTTP 301永久移動。捲曲仍然給出退出代碼0。 - wisbucky
@wisbucky 301不是錯誤,它是重定向狀態代碼。錯誤是4xx和5xx狀態代碼。 - M. Justin


如果您只想顯示捲曲頁面的內容,可以執行以下操作:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

這會將頁面的內容寫入STDERR,同時將HTTP狀態代碼寫入STDOUT,因此可以將其分配給變量 的StatusCode


67
2018-05-01 15:31



如果我想在失敗時輸出響應怎麼樣? (非200),但返回非 0 腳本中的狀態代碼? - Justin
@Justin:那怎麼樣 if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti:只支持無符號的8位退出代碼,因此可能會有點混亂。 - Dennis
啊,對 - 代碼將以8位換行,因此錯誤404變為退出值148,500會變為244.確實令人困惑! :-) - ghoti
作為一個小的變化,這會捕獲變量中的代碼,同時將響應重定向到stdout,而不是stderr: { code=$(curl ... as above ...); } 2>&1 訣竅是 { ... } 2>&1 允許重定向,而不是產生不同的shell ( ... ) 將。 - Tobia


我能夠使用標誌組合來做到這一點:

curl --silent --show-error --fail URL

- 無聲 隱藏進度和錯誤
- 顯示,錯誤 顯示隱藏的錯誤消息 --silent
- 失敗 請求失敗時返回退出代碼> 0


14
2017-09-12 14:48



這不顯示服務器回复。我不是OP但我懷疑他想看到來自服務器的任何錯誤消息,它在正文中返回。除了一個 --silent --show-error --fail 和你一樣工作 -f/--fail。 - waste
其實, --fail 返回退出代碼 22, 記錄在案。 - Quolonel Questions
這不會捕獲HTTP 301永久移動。捲曲仍然給出退出代碼0。 - wisbucky
@wisbucky 301不是錯誤,它是重定向狀態代碼。錯誤是4xx和5xx狀態代碼。 - M. Justin
為了公平對待@wisbucky,最初的問題是 “[...]如果HTTP狀態代碼不是200”。之前沒有提到“錯誤”。 - ken