Napsal jsem skript, který obsahuje until
smyčka. Tato smyčka by měla běžet, dokud není booleovská proměnná nastavena na true
z vnějšku smyčky. Bohužel smyčka ignoruje, že proměnná byla nastavena na true a běží dál. Zde je několik řádků, které generují tento problém:
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"
Výstup, který to generuje, je:
false
false
false
false
boolean is true now
false
false
false
...
Jak mohu provést ukončení smyčky, když je boolean
je nastaveno na true
?
Přijatá odpověď:
&
postava dělá proces na pozadí. Proces na pozadí se provádí asynchronně v subshell. Proměnné mohou být předány z nadřazeného shellu do sub-shell, nikoli naopak. Pokud však opravdu potřebujete hodnotu nastavenou v podřízeném prostředí, můžete to obejít:
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)"
To vytvoří dočasný soubor, jehož obsahem je logická hodnota. V until
smyčka, že soubor je kontrolován, dokud neobsahuje true.
Upozornění:
Doporučuji ve vašem skriptu provést následující (pokud je to možné):
{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."
wait
čeká na dokončení procesu na pozadí.