J'ai écrit un script qui contient un until
boucle. Cette boucle doit s'exécuter jusqu'à ce qu'une variable booléenne soit définie sur true
de l'extérieur de la boucle. Malheureusement, la boucle ignore que la variable a été définie sur true et continue de s'exécuter. Voici quelques lignes qui génèrent ce problème :
boolean=false
{ sleep 5 && boolean=true && echo "boolean is true now" ; } &
{ until [ "$boolean" = true ] ; do sleep 1 && echo $boolean ; done ; } &&
echo "boolean is true now: $boolean"
La sortie générée est :
false
false
false
false
boolean is true now
false
false
false
...
Comment puis-je faire sortir la boucle lorsque le boolean
est défini sur true
?
Réponse acceptée :
Le &
le personnage effectue un processus d'arrière-plan. Un processus d'arrière-plan est exécuté de manière asynchrone dans un sous-shell. Les variables peuvent être transmises d'un shell parent à un sous-shell, et non l'inverse. Cependant, vous pouvez contourner le problème si vous avez vraiment besoin de la valeur définie dans le shell enfant :
boolean=$(mktemp) && echo "false" >$boolean
{ sleep 5 && echo true >$boolean && echo "boolean is true now" ; } &
{ until [ "$(cat $boolean)" = "true" ] ; do sleep 1 && cat $boolean ; done ; } &&
echo "boolean is true now: $(cat $boolean)"
Cela fait un fichier temporaire dont le contenu est la valeur booléenne. Dans le until
bouclez ce fichier est vérifié jusqu'à ce qu'il contienne true.
Avis :
Je recommande de faire ce qui suit dans votre script (si possible) :
{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."
wait
attend la fin du processus d'arrière-plan.