J'ai un script (run-docker-container.sh) qui appelle un autre script (create-docker-container.sh). create-docker-container exécute un script curl contre le docker remote api et renvoie le code http ou zéro en cas de succès. Le script de création renvoie ainsi
echo $RVAL exit $RVAL
et dans mes tests a la valeur de $ RVAL comme 404, la valeur que je suis intéressé par cette question.
Dans mon script run-docker-container, j'ai les lignes suivantes
create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS rval=$? echo $rval if [ $rval -eq 404 ]; then ... fi
même si créer semble sortir avec 404, la valeur que je reçois pour $?
est 148 et donc ma gestion de la condition n'est pas appelée. Pourquoi serait-ce et comment puis-je get correctement le code de sortie du script?
Pour des raisons historiques, le statut de sortie d'un process est un nombre de 8 bits. Le nombre que vous passez à la exit
est réduit modulo 256 (2⁸).
En outre, les valeurs 126 et supérieures ont une signification conventionnelle, indiquant un échec au démarrage du programme (126 ou 127) ou un programme qui a été tué par un signal (128 et au-dessus). Donc, alors que vous pouvez returnner de telles valeurs, vous ne devriez pas le faire, sauf si vous voulez simuler ces conditions.
La règle est de renvoyer 0 pour le succès et une autre valeur pour indiquer les erreurs. C'est une règle dans la mesure où de nombreux outils interprètent 0 comme succès: commands conditionnelles telles que if
et while
, outils qui abandonnent des erreurs telles que des scripts shell sous set -e
et makefiles, etc.
En ce qui concerne les erreurs, les conventions les plus courantes sont de renvoyer 1 sur n'importe quelle erreur, ou de renvoyer 2 sur n'importe quelle erreur. La troisième convention commune consiste à renvoyer 1 sur un échec attendu (par exemple, une command de search qui ne trouve rien) et 2 sur un échec inattendu (par exemple, le file à searchr n'existait pas). Si vous devez mapper les codes d'erreur HTTP dans l'état de sortie, vous disposez de la plage 1-125 (avec 200 mappages de succès sur 0), il n'y a pas de standard pour cela.