Escribí un script que contiene un until
círculo. Este ciclo debe ejecutarse hasta que una variable booleana se establezca en true
desde fuera del bucle. Desafortunadamente, el bucle ignora que la variable se ha establecido en verdadero y sigue ejecutándose. Aquí hay algunas líneas que generan este 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"
La salida que esto genera es:
false
false
false
false
boolean is true now
false
false
false
...
¿Cómo puedo hacer que el ciclo salga cuando el boolean
se establece en true
?
Respuesta aceptada:
El &
el personaje hace un proceso de fondo. Un proceso en segundo plano se ejecuta de forma asíncrona en una subcapa. Las variables se pueden pasar de un shell principal a un subshell, no al revés. Sin embargo, puede solucionarlo si realmente necesita el valor establecido en el shell secundario:
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)"
Eso crea un archivo temporal cuyo contenido es el valor booleano. En el until
bucle ese archivo se comprueba hasta que contenga verdadero.
Aviso:
Recomiendo hacer lo siguiente en su secuencia de comandos (si es posible):
{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."
wait
espera a que finalice el proceso en segundo plano.