Como verificar se um comando como curl foi concluído sem erro?

22

Estou usando o curl para enviar um arquivo para um servidor por meio de uma postagem HTTP.

curl -X POST [email protected] server-URL

Quando eu manualmente executo este comando na linha de comando, recebo uma resposta do servidor como "Upload successful" . No entanto, como se eu quiser executar esse comando curl por meio de um script, como posso saber se minha solicitação POST foi bem-sucedida?

    
por Wes 15.04.2014 / 17:44

2 respostas

18

A maneira mais simples é armazenar a resposta e compará-la:

$ response=$(curl -X POST [email protected] server-URL);
$ if [ "Upload successful" == "${response}" ]; then … fi;

Eu não testei isso. A sintaxe pode estar desativada, mas essa é a ideia. Tenho certeza de que existem maneiras mais sofisticadas de fazer isso, como verificar o código de saída do curl ou algo assim.

atualizar

curl retorna alguns códigos de saída. Eu estou supondo que uma postagem com falha pode resultar em 55 Failed sending network data. Então, você provavelmente poderia apenas certificar-se de que o código de saída era zero, comparando com $? ( Expands to the exit status of the most recently executed foreground pipeline. ):

$ curl -X POST [email protected] server-URL;
$ if [ 0 -eq $? ]; then … fi;

Ou se o seu comando for relativamente curto e você quiser fazer algo quando ele falhar, você pode confiar no código de saída como a condição em uma instrução condicional:

$ if curl --fail -X POST [email protected] server-URL; then
    # …(success)
else
    # …(failure)
fi;

Eu acho que esse formato é geralmente preferido , mas pessoalmente acho menos legível.

    
por 15.04.2014 / 17:52
12

Você pode usar a opção curl's --fail , mas deve testá-la uma vez primeiro.

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 pre‐ vent 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).

Desta forma, você poderia fazer:

args="-X POST [email protected] server-URL"
curl -f $args && echo "SUCCESS!" ||
    echo "OH NO!"
    
por 16.04.2014 / 06:23