GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Schleife ignoriert Variablenänderung aus einer Subshell im Hintergrund?

Ich habe ein Skript geschrieben, das ein until enthält Schleife. Diese Schleife sollte laufen, bis eine boolesche Variable auf true gesetzt wird von außerhalb der Schleife. Leider ignoriert die Schleife, dass die Variable auf wahr gesetzt wurde und läuft weiter. Hier sind ein paar Zeilen, die dieses Problem erzeugen:

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"

Die dadurch generierte Ausgabe ist:

false
false
false
false
boolean is true now
false
false
false
...

Wie kann ich die Schleife beenden, wenn der boolean auf true gesetzt ist ?

Akzeptierte Antwort:

Der & Charakter macht einen Hintergrundprozess. Ein Hintergrundprozess wird asynchron in einer Subshell ausgeführt. Variablen können von einer übergeordneten Shell an eine untergeordnete Shell übergeben werden, nicht umgekehrt. Sie können jedoch eine Problemumgehung durchführen, wenn Sie den in der untergeordneten Shell festgelegten Wert wirklich benötigen:

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)"

Dadurch entsteht eine temporäre Datei, deren Inhalt der boolesche Wert ist. Im until Schleife, dass die Datei überprüft wird, bis sie wahr enthält.

Hinweis:

Ich empfehle Folgendes in Ihrem Skript (wenn möglich):

{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."

wait wartet auf das Ende des Hintergrundprozesses.


Linux
  1. Wie setze ich eine Variable gleich der Ausgabe eines Befehls in Grub2?

  2. Schriftart im Echo-Befehl ändern?

  3. So ändern Sie die PATH-Variable in Linux

  4. Generieren eines SHA-256-Hashs über die Linux-Befehlszeile

  5. Holen Sie sich die letzten 4 Zeichen der Ausgabe von Standardausgabe

So ändern Sie die Ausgabefarbe von „Echo“ in Linux

Liest Werte aus einer Pipe in eine Shell-Variable ein

Wie ändere ich den Terminal-Cursor von Box zu Zeile?

Der MD5-Hashwert unterscheidet sich von Bash und PHP

Wie kann ich einen Befehl verzögert im Hintergrund ausführen?

SSH-Login daran hindern, motd vom Client zu drucken?