65 votes

Pourquoi "local" balaie-t-il le code retour d'une commande ?

Cet extrait de Bash fonctionne comme je m'y attendais :

 $ fun1() { x=$(false); echo "exit code: $?"; }
$ fun1
exit code: 1

Mais celui-ci, en utilisant local , ne fait pas :

 $ fun2() { local x=$(false); echo "exit code: $?"; }
$ fun2
exit code: 0

Quelqu'un peut-il expliquer pourquoi local balaye le code de retour de la commande ?

75voto

SiegeX Points 32614

La raison pour laquelle le code avec local renvoie 0 est que $? "s'étend jusqu'à l'état de sortie du pipeline de premier plan exécuté le plus récemment." Ainsi $? renvoie le succès de local

Vous pouvez corriger ce comportement en séparant la déclaration de x de l'initialisation de x comme ceci :

 $ fun() { local x; x=$(false); echo "exit code: $?"; }; fun
exit code: 1

5voto

Le code retour de la commande local masque le code retour de false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X