Tôi biết tôi có thể chờ đợi một điều kiện để trở thành sự thật trong bash bằng cách thực hiện:
while true; do
test_condition && break
sleep 1
done
Nhưng nó tạo ra 1 quy trình phụ ở mỗi lần lặp (ngủ). Tôi có thể tránh chúng bằng cách làm:
while true; do
test_condition && break
done
Nhưng nó sử dụng rất nhiều CPU (chờ đợi bận rộn). Để tránh các quy trình phụ và chờ đợi bận rộn, tôi đã đưa ra giải pháp dưới đây, nhưng tôi thấy nó thật xấu xí:
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.
Lưu ý: trong trường hợp chung, tôi không thể đơn giản sử dụng read -t 1 var
mà không có fifo, vì nó sẽ tiêu thụ stdin và sẽ không hoạt động nếu stdin không phải là thiết bị đầu cuối hoặc đường ống.
Tôi có thể tránh các quy trình phụ và chờ đợi một cách thanh lịch hơn không?
true
, cập nhật câu hỏi.
read -t 1 var
thôi.
sleep
ví dụ đầu tiên. Cái thứ hai, trong khi nó có thể hoạt động, sẽ không dễ dàng cho bất cứ ai điều chỉnh trong tương lai. Mã đơn giản cũng có tiềm năng lớn hơn để được an toàn.
true
là một nội trang và không tạo ra một quy trình phụ trong bash. bận rộn chờ đợi sẽ luôn luôn xấu.