187

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

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

3 ответа3

211

curl --fail делает часть того, что вы хотите:

от man curl:

-f, --fail

(HTTP) Сбой молча (вообще не выводится) при ошибках сервера. В основном это делается для того, чтобы лучше включать скрипты и т.д., Чтобы лучше справляться с неудачными попытками. В обычных случаях, когда HTTP-серверу не удается доставить документ, он возвращает HTML-документ с указанием так (что часто также описывает причину и многое другое). Этот флаг предотвратит вывод curl и вернет ошибку 22.

Этот метод не является отказоустойчивым, и бывают случаи, когда неуспешные коды ответов проскальзывают, особенно когда задействована аутентификация (коды ответов 401 и 407).

Но он блокирует вывод на экран.

73

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

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

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

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

20

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .