So di poter aspettare che una condizione si avveri in bash facendo:
while true; do
test_condition && break
sleep 1
done
Ma crea 1 sottoprocesso ad ogni iterazione (sleep). Potrei evitarli facendo:
while true; do
test_condition && break
done
Ma utilizza molta CPU (attesa in attesa). Per evitare sottoprocessi e attese impegnative, ho trovato la soluzione qui sotto, ma la trovo brutta:
my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo # Create an empty fifo for sleep by read.
exec 3<> $my_tmp_dir/fifo # Open the fifo for reading and writing.
while true; do
test_condition && break
read -t 1 -u 3 var # Same as sleep 1, but without sub-process.
done
exec 3<&- # Closing the fifo.
rm $my_tmp_dir/fifo; rmdir $my_tmp_dir # Cleanup, could be done in a trap.
Nota: nel caso generale, non posso semplicemente usare read -t 1 var
senza il fifo, perché consumerà stdin e non funzionerà se stdin non è un terminale o una pipe.
Posso evitare sottoprocessi e attese impegnate in un modo più elegante?
true
, domanda aggiornata.
read -t 1 var
.
sleep
come nel primo esempio. Il secondo, sebbene possa funzionare, non sarà facile per nessuno adattarsi in futuro. Il codice semplice ha anche un maggiore potenziale per essere sicuro.
true
è incorporato e non crea un processo secondario in bash. l'attesa impegnata sarà sempre negativa.