2016-10-12 4 views
0

Je suis en train d'enregistrer le code de sortie d'exécuter psql dans un script shell. En supposant que la commande psql juste avant cet extrait était mauvaise, je m'attends à ce que cet extrait renvoie tout sauf 1, ce qu'il fait initialement. Mais quand je cède à exitcode puis echo il, la valeur retournée est un 0 ...Quelle est la meilleure façon de conserver un code de sortie ou de l'assigner à une variable avec Bash?

$ echo $? 
    1 
$ exitcode=$? 
$ echo 'simply' 
    simply 
$ #echo $? 
    0 
$ #echo 'coding' 
    coding 
$ echo $exitcode 
    0 

J'essaie d'obtenir la exitcode variable pour imprimer ou écho 1 comme la première ligne fait. Comment est-ce que je fais exactement cela?

+0

Le code de sortie de 'psql' &' OS' est différent. Qu'est-ce que vous essayez ici – Ashish

+2

Affectez à 'exitcode' * avant * que vous ne fassiez écho $?'. La façon dont vous l'avez fait, vous avez enregistré le code de sortie de 'echo', pas' psql'. – Barmar

+1

Le code de sortie ($?) De votre deuxième ligne n'est pas de psql mais votre première ligne 'echo $?' –

Répondre

1

Lorsque vous imprimez $? la deuxième fois, c'est pas le code de sortie de la commande précédente. Vous devez affecter $? à exitcode immédiatement avant d'exécuter toute autre commande.

à-dire

$ psql 
$ echo $? 
    1 
$ exitcode=$? 

devrait être

$ psql 
$ exitcode=$? 

afin de conserver le code de sortie de psql.

+0

Merci. Si je cours 'psql; exitcode = $ ?; echo $ exitcode; echo $ exitcode; ', alors j'obtiens' 1' puis '0'. J'oublie la terminologie pour quand cela arrive avec l'assignation de variable, mais est-ce normal? – simplycoding

+0

Ce que vous avez observé est attendu. –

+1

Non ce n'est pas. La valeur changeante de $ exitcode est absolument inattendue. C'est ce qu'on appelle * évaluation paresseuse *, et bash ne l'a pas. Il n'y a aucun moyen 'echo $ exitcode; echo $ exitcode; 'pourrait produire' 1' puis '0'. –