Могу ли я заставить cURL завершиться с ошибкой с кодом выхода, отличным от 0, если код состояния HTTP не равен 200?

74314
knocte

Я всегда предполагал, что когда curl получил ответ HTTP 500, он возвращал код выхода, который означал сбой (! = 0), но, похоже, это не так.

Есть ли способ, как я могу сделать сбой cURL с кодом выхода, отличным от 0, если код состояния HTTP не 200? Я знаю, что могу использовать, -w "%"но это помещает его в STDOUT, а не в качестве кода выхода (кроме того, я также заинтересован в захвате вывода, который я не хочу перенаправлять в файл, но на экран).

172

3 ответа на вопрос

197
rampion

curl --fail does part of what you want:

from man curl:

-f, --fail

(HTTP) Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed attempts. In normal cases when an HTTP server fails to deliver a document, it returns an HTML document stating so (which often also describes why and more). This flag will prevent curl from outputting that and return error 22.

This method is not fail-safe and there are occasions where non-successful response codes will slip through, especially when authentication is involved (response codes 401 and 407).

But it blocks output to the screen.

Так какие части этого он делает и не делает? rogerdpack 8 лет назад 2
@rogerdpack tl; dr возвращает ненулевое значение при обнаружении неверного ответа, но не позволяет OP перехватить ответ rampion 8 лет назад 3
Это не ловит HTTP 301 Переместить постоянно. curl еще дал код выхода 0. wisbucky 6 лет назад 0
@wisbucky 301 не ошибка, это код состояния перенаправления. Ошибки представляют собой коды состояния 4xx и 5xx. M. Justin 6 лет назад 1
70
Dennis

Если вы просто хотите отобразить содержимое скрученной страницы, вы можете сделать это:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%" URL)  if test $STATUSCODE -ne 200; then # error handling fi 

При этом содержимое страницы записывается в STDERR, а код состояния HTTP в STDOUT, поэтому его можно назначить переменной STATUSCODE .

Как насчет того, если я хочу вывести ответ при ошибке * (не 200) *, но вернуть из сценария код состояния, отличный от `0`? Justin 9 лет назад 3
@Justin: А как насчет `if [" $ statuscode "-ne 200]; затем выйдите из «$ statuscode»; фиа? ghoti 9 лет назад 1
@ghoti: поддерживаются только 8-битные коды выхода без знака, так что это может немного запутать. Dennis 9 лет назад 4
Ах, верно - и коды будут переноситься в 8 бит, поэтому ошибка 404 становится выходным значением 148, 500 становится 244. Действительно, сбивает с толку! :-) ghoti 9 лет назад 3
В качестве небольшого изменения это захватывает код в переменной при перенаправлении ответа на стандартный вывод, а не на stderr: ` 2> & 1` Хитрость заключается в `{...} 2> & 1`, которая позволяет перенаправлять, не вызывая другую оболочку, как` (...) `. Tobia 7 лет назад 6
аналогично, вы можете передать по конвейеру `awk`, а не заключать его в скрипт:` curl -w '\ n% ' --silent $ URL | awk 'END / ^ 200 $ / '` rampion 7 лет назад 0
14
rcdmk

Я смог сделать это с помощью комбинации флагов:

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

--silent скрывает прогресс и ошибку
--show-error показывает скрытое сообщение об ошибке --silent
--fail возвращает код завершения> 0, когда запрос не выполняется

Это не показывает ответ сервера. Я не OP, но я подозреваю, что он хотел увидеть любое сообщение об ошибке от сервера, которое возвращается в теле. Кроме того, `--silent --show-error --fail` работает так же, как просто` -f / - fail`. waste 7 лет назад 2
На самом деле, `--fail` возвращает код выхода` 22`, [как задокументировано] (https://ec.haxx.se/usingcurl-returns.html). Quolonel Questions 6 лет назад 1
Это не ловит HTTP 301 Переместить постоянно. curl еще дал код выхода 0. wisbucky 6 лет назад 0
@wisbucky 301 не ошибка, это код состояния перенаправления. Ошибки представляют собой коды состояния 4xx и 5xx. M. Justin 6 лет назад 1
Чтобы быть справедливым по отношению к @wisbucky, оригинальный вопрос гласит _ "[...] если код состояния HTTP не равен 200" _. Никаких упоминаний об «ошибке» нигде раньше. ken 6 лет назад 1

Похожие вопросы