Sé que puedo esperar que una condición se haga realidad en bash haciendo:
while true; do
test_condition && break
sleep 1
done
Pero crea 1 subproceso en cada iteración (suspensión). Podría evitarlos haciendo:
while true; do
test_condition && break
done
Pero usa mucha CPU (espera ocupada). Para evitar subprocesos y esperas ocupadas, se me ocurrió la solución a continuación, pero me parece fea:
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: en el caso general, no puedo simplemente usarlo read -t 1 var
sin el fifo, porque consumirá stdin y no funcionará si stdin no es un terminal o una tubería.
¿Puedo evitar los subprocesos y la espera ocupada de una manera más elegante?
true
, pregunta actualizada.
read -t 1 var
.
sleep
como en el primer ejemplo. El segundo, si bien puede funcionar, no va a ser fácil para nadie en el futuro. El código simple también tiene un mayor potencial para ser seguro.
true
es incorporado y no crea un subproceso en bash. La espera ocupada siempre será mala.