Comment vérifier si une commande telle que curl s'est terminée sans erreur?

24

J'utilise curl pour télécharger un fichier sur un serveur via une publication HTTP.

curl -X POST [email protected] server-URL

Lorsque j'exécute manuellement cette commande sur la ligne de commande, j'obtiens une réponse du serveur comme "Upload successful". Cependant, comment si je veux exécuter cette commande curl via un script, comment puis-je savoir si ma demande POST a réussi?

Nous s
la source

Réponses:

21

Le moyen le plus simple est de stocker la réponse et de la comparer:

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

Je n'ai pas testé ça. La syntaxe est peut-être éteinte, mais c'est l'idée. Je suis sûr qu'il existe des moyens plus sophistiqués de le faire, tels que la vérification du code de sortie de curl ou quelque chose.

mise à jour

curlrenvoie pas mal de codes de sortie. Je suppose qu'un message ayant échoué pourrait entraîner une erreur.Vous pourriez 55 Failed sending network data.donc probablement vous assurer que le code de sortie était zéro en comparant à $?( 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 si votre commande est relativement courte et que vous voulez faire quelque chose en cas d'échec, vous pouvez vous fier au code de sortie comme condition dans une instruction conditionnelle:

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

Je pense que ce format est souvent préféré , mais personnellement je le trouve moins lisible.

Jorge Bucaran
la source
20

Vous pourrez peut-être utiliser l' curl's --failoption, mais vous devez d'abord la tester.

man curl

-f, --fail (HTTP) Échec en silence (pas de sortie du tout) sur les erreurs du serveur. Cela est principalement fait pour mieux activer les scripts, etc. pour mieux gérer les tentatives infructueuses. Dans les cas normaux, lorsqu'un serveur HTTP ne parvient pas à livrer un document, il renvoie un document HTML indiquant cela (qui décrit souvent aussi pourquoi et plus). Ce drapeau empêchera la boucle de sortir cela et retournera l'erreur 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).

De cette façon, vous pourriez simplement faire:

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