Eu sei que posso esperar que uma condição se torne realidade no bash fazendo:
while true; do
test_condition && break
sleep 1
done
Mas ele cria 1 subprocesso a cada iteração (suspensão). Eu poderia evitá-los fazendo:
while true; do
test_condition && break
done
Mas ele usa muita CPU (espera ocupada). Para evitar subprocessos e espera ocupada, vim com a solução abaixo, mas acho feia:
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: no caso geral, não posso simplesmente usar read -t 1 var
sem o fifo, porque ele consumirá o stdin e não funcionará se o stdin não for um terminal ou um pipe.
Posso evitar subprocessos e espera ocupada de uma maneira mais elegante?
true
, pergunta atualizada.
read -t 1 var
.
sleep
o exemplo do primeiro exemplo. O segundo, embora funcione, não será fácil para ninguém se adaptar no futuro. O código simples também tem um potencial maior de segurança.
true
é um builtin e não cria um subprocesso no bash. A espera ocupada sempre será ruim.