Pourquoi le code de sortie d'un script semble-t-il avoir une valeur différente de celle renvoyée?

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.