Ho scritto uno script che contiene un until
ciclo continuo. Questo ciclo dovrebbe essere eseguito finché una variabile booleana non è impostata su true
dall'esterno del circuito. Sfortunatamente il ciclo ignora che la variabile è stata impostata su true e continua a funzionare. Ecco alcune righe che generano questo problema:
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"
L'output che genera è:
false
false
false
false
boolean is true now
false
false
false
...
Come posso fare in modo che il ciclo esca quando boolean
è impostato su true
?
Risposta accettata:
Il &
il personaggio fa un processo in background. Un processo in background viene eseguito in modo asincrono in una subshell. Le variabili possono essere passate da una shell madre a una shell secondaria, non viceversa. Tuttavia, puoi risolvere il problema se hai davvero bisogno del valore impostato nella shell figlio:
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)"
Ciò crea un file temporaneo il cui contenuto è il valore booleano. Nel until
loop quel file viene controllato finché non contiene true.
Avviso:
Ti consiglio di fare quanto segue nel tuo script (se possibile):
{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."
wait
attende il completamento del processo in background.