Wiem, że mogę czekać na spełnienie warunku bash, wykonując:
while true; do
test_condition && break
sleep 1
done
Ale tworzy 1 podproces przy każdej iteracji (uśpieniu). Mogłem ich uniknąć, wykonując:
while true; do
test_condition && break
done
Ale zużywa dużo procesora (zajęte oczekiwanie). Aby uniknąć podprocesów i zajętego czekaniem, wymyśliłem poniższe rozwiązanie, ale wydaje mi się brzydkie:
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.
Uwaga: w ogólnym przypadku nie mogę po prostu użyć read -t 1 var
bez fifo, ponieważ zużyje standardowe wejście i nie będzie działać, jeśli standardowe wejście nie jest terminalem ani rurą.
Czy mogę uniknąć podprocesów i zajętego oczekiwania w bardziej elegancki sposób?
true
, pytanie zaktualizowane.
read -t 1 var
.
sleep
jak w pierwszym przykładzie. Drugi, choć może działać, nie będzie łatwo nikomu się dostosowywać w przyszłości. Prosty kod ma również większy potencjał bezpieczeństwa.
true
jest wbudowany i nie tworzy podprocesu w bash. zajęty czekaniem zawsze będzie źle.