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

24

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

curl -X POST [email protected] server-URL

Quando executo manualmente 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 descobrir se minha solicitação POST foi bem-sucedida?

Wes
fonte

Respostas:

21

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

curlretorna alguns códigos de saída. Suponho que uma postagem com falha pode resultar em 55 Failed sending network data.Portanto, você provavelmente pode garantir que o código de saída seja 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ê desejar fazer algo quando falhar, poderá confiar no código de saída como 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.

Jorge Bucaran
fonte
20

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

man curl

-f, --fail (HTTP) falha silenciosamente (sem saída) nos erros do servidor. Isso é feito principalmente para melhor habilitar scripts, etc., para lidar melhor com tentativas falhas. Em casos normais, quando um servidor HTTP falha na entrega de um documento, ele retorna um documento HTML informando isso (que geralmente também descreve o porquê e mais). Este sinalizador impedirá a ondulação de gerar isso e retornará o erro 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).

Dessa forma, você pode simplesmente fazer:

args="-X POST [email protected] server-URL"
curl -f $args && echo "SUCCESS!" ||
    echo "OH NO!"
mikeserv
fonte