Posso fazer o cURL falhar com um exitCode diferente de 0 se o código de status HTTP não for 200?

170

Eu sempre presumi que quando o curl obtinha uma resposta HTTP 500, ele retornava um código de saída que significava falha (! = 0), mas isso parece não ser o caso.

Existe alguma maneira de fazer cURL falhar com um exitCode diferente de 0 se o código de status HTTP não for 200? Eu sei que eu posso usar -w "%{http_code}" , mas que coloca em STDOUT, não como o código de saída (além disso, também estou interessado em capturar a saída, que eu não quero redirecionar para um arquivo, mas para a tela) .

    
por knocte 01.05.2013 / 14:37

3 respostas

191

curl --fail faz parte do que você deseja:

de 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).

Mas bloqueia a saída para a tela.

    
por 10.10.2013 / 20:36
67

Se você quiser apenas exibir o conteúdo da página enrolada, faça o seguinte:

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

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

Isto grava o conteúdo da página para STDERR enquanto escreve o código de status HTTP para STDOUT, então ele pode ser atribuído à variável STATUSCODE .

    
por 01.05.2013 / 17:31
14

Consegui fazer isso usando uma combinação de sinalizadores:

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

- silent oculta o progresso e o erro
- show-error mostra a mensagem de erro ocultada por --silent
- falha retorna um código de saída > 0 quando o pedido falha

    
por 12.09.2017 / 16:48