Я знаю, что могу подождать, пока условие станет истинным в bash, выполнив:
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
без fifo, потому что он будет использовать stdin и не будет работать, если stdin не является терминалом или каналом.
Могу ли я избежать подпроцессов и занятого ожидания более элегантным способом?
true
, вопрос обновлен.
read -t 1 var
.
sleep
принципу, что и в первом примере. Второй способ, хотя он и может работать, не будет легко адаптироваться в будущем. Простой код также имеет больший потенциал для безопасности.
true
является встроенным и не создает подпроцесс в Bash. Ожидание всегда будет плохо.