web-dev-qa-db-fra.com

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

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 savoir si ma demande POST a réussi?

24
Wes

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

curl renvoie plusieurs codes de sortie. J'imagine qu'un message ayant échoué pourrait entraîner 55 Failed sending network data. Donc, vous pourriez 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.

21
user61786

Vous pourrez peut-être utiliser curl's --fail, bien que vous deviez le tester une première fois.

man curl

-f, --fail (HTTP) Échec en silence (pas de sortie du tout) sur les erreurs du serveur. Ceci 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 qui l'indique (qui décrit souvent 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!"
23
mikeserv