Я знаю, що можу чекати, коли умова стане справжньою в баші, роблячи:
while true; do
test_condition && break
sleep 1
done
Але це створює 1 підпроцес при кожній ітерації (сон). Я міг би їх уникнути, роблячи:
while true; do
test_condition && break
done
Але він використовує багато процесора (зайнятий в очікуванні). Щоб уникнути підпроцесів та зайнятого очікування, я придумав рішення нижче, але вважаю це некрасивим:
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.
Примітка: у загальному випадку я не можу просто використовувати read -t 1 var
без файлу, тому що він буде споживати stdin, і він не працюватиме, якщо stdin не є терміналом або трубою.
Чи можу я уникнути підпроцесів і зайнятого очікування більш елегантним способом?
true
, питання оновлено.
read -t 1 var
.
sleep
як у першому прикладі. Другий, хоча це може спрацювати, нікому не буде легко коригуватись у майбутньому. Простий код також має більший потенціал для безпеки.
true
є вбудованим і не створює підпроцес у bash. зайняте очікування завжди буде погано.