GNU/Linux >> Linux Esercitazione >  >> Linux

Il ciclo ignora la modifica della variabile da una subshell in background?

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.


Linux
  1. Come modificare il nome di una variabile Bash in un ciclo e quindi espandere il nome modificato?

  2. Cambia carattere nel comando Echo?

  3. Come modificare il kernel predefinito (avvio dal vecchio kernel) in CentOS/RHEL 8

  4. Legge i valori in una variabile di shell da una pipe

  5. Ottieni gli ultimi 4 caratteri dell'output da standard out

Come modificare il colore di output di "Echo" in Linux

Il valore hash MD5 è diverso da Bash e PHP

Cambia il numero della partizione da sda1 a sda2

Come eseguire un comando in background con un ritardo?

Come modificare la directory predefinita della nuova finestra dall'interno di tmux

Impedisci a ssh login di stampare motd dal client?