Je sais que je peux attendre une condition pour devenir vrai en bash en faisant:
while true; do
test_condition && break
sleep 1
done
Mais il crée 1 sous-processus à chaque itération (sommeil). Je pourrais les éviter en faisant:
while true; do
test_condition && break
done
Mais il utilise beaucoup de CPU (attente occupée). Pour éviter les sous-processus et les attentes occupées, j'ai trouvé la solution ci-dessous, mais je la trouve moche:
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.
Remarque: dans le cas général, je ne peux pas simplement utiliser read -t 1 var
sans le fifo, car il consommera stdin et ne fonctionnera pas si stdin n'est pas un terminal ou un pipe.
Puis-je éviter les sous-processus et les attentes occupées de manière plus élégante?
true
, question mise à jour.
read -t 1 var
.
sleep
comme dans le premier exemple. Le second, même s'il peut fonctionner, ne sera pas facile pour quiconque de s'adapter à l'avenir. Le code simple a également un plus grand potentiel de sécurité.
true
est une fonction intégrée et ne crée pas de sous-processus dans bash. une attente occupée sera toujours mauvaise.