GNU/Linux >> Tutoriels Linux >  >> Linux

La boucle ignore le changement de variable d'un sous-shell en arrière-plan ?

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.


Linux
  1. Comment définir une variable égale à la sortie d'une commande dans Grub2 ?

  2. Comment changer le nom d'une variable bash dans une boucle, puis développer le nom modifié ?

  3. Linux - Changer le numéro de la partition de Sda1 à Sda2 ?

  4. Comment changer le noyau par défaut (démarrer à partir de l'ancien noyau) dans CentOS/RHEL 8

  5. Lire des valeurs dans une variable shell à partir d'un tube

Comment changer la couleur de sortie de 'Echo' sous Linux

La valeur de hachage MD5 est différente de Bash et PHP

Changer le numéro de la partition de sda1 à sda2

Comment exécuter une commande en arrière-plan avec un délai ?

Comment changer le nouveau répertoire de fenêtre par défaut à partir du tmux

Empêcher la connexion ssh d'imprimer motd depuis le client ?