2016-12-22 1 views
0

Je l'extrait de code suivant travail tel que mon script bash sort tôt en cas d'écheclire le code retour du script bash au script bash?

./gradlew clean build release 
if [ $? -eq 0 ] 
then 
    echo "Successfully BUILT FAKE RELEASE" 
else 
    echo "BUILDING FAKE RELEASE FAILED" 
    exit $? 
fi 

Je vois la déclaration de journal d'échec mais mon script qui l'appelle continue au lieu de sortir et dans ce script, j'ai à peu près le même code

./runAllTesting.sh 
if [ $? -eq 0 ] 
then 
    echo "Successfully RAN ALL TESTING" 
else 
    echo "TESTING SYSTEM Failed(don't release this)" 
    exit $? 
fi 

Qu'est-ce que je fais mal ici? Ceci est sur 10.11.6 el capitan mac ordinateur.

+5

Je pense que '$?' dans le paramètre 'exit' retournera toujours le succès parce que la commande qui le précède est' echo', qui réussira toujours –

+0

oh merde, lol, duh moi. @KoCour –

Répondre

2

mon script qui l'appelle continue

Oui, vous devriez vérifier le code de sortie de votre extrait dans le script appelant, se comportent alors en conséquence

if ! ./posted_snippet.sh; then 
    exit 
fi 

De cette façon, le niveau supérieur se termine, mais perd l'information sur l'erreur code qui l'a fait sortir. Il est souvent hors de propos, car les messages d'erreur de posted_snippet.sh indiqueraient quel test a échoué et pourquoi. Toutefois, si ce code d'erreur doit être passé au niveau supérieur, on peut utiliser la forme concise

./posted_snippet.sh || exit $? 

qui est bien meilleur que if ./posted_snippet.sh; then :; else exit $?; fi.

Ce qui est crucial est que posted_snippet.sh devrait quitter avec le code correct, et il a déjà été souligné dans les commentaires que ce n'est pas le cas. Votre $? capture le code de sortie de echo, qui est toujours 0. Voici une version de travail:

./runAllTesting.sh 
test_result=$? 
if [ $test_result -eq 0 ]; then 
    echo "Successfully RAN ALL TESTING" 
else 
    echo "TESTING SYSTEM Failed(don't release this)" 
    exit $test_result 
fi 
2

$? signifie ce qui est de l'état de sortie de la dernière commande exécutée. La dernière commande exécutée est echo "TESTING SYSTEM Failed(don't release this)" et s'est exécutée avec succès. Ce que vous étiez en train de faire après cette déclaration d'écho était exit 0. La solution consiste à enregistrer $? dans une variable

./gradlew clean build release 
readonly status=$? 
if [[ $status -eq 0 ]];then 
    echo "Successfully BUILT FAKE RELEASE" 
else 
    echo "BUILDING FAKE RELEASE FAILED" 
    exit $status 
fi 

La solution ci-dessus ne fonctionnera pas si et seulement si vous exécutez l'instruction if conditionnelle dans un processus enfant dans votre script

+0

Pourquoi 'readonly'? –

+0

afin que la valeur ne soit pas écrasée –

+0

Ecrasé par qui? –