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.