Saya tahu saya bisa menunggu dengan syarat untuk menjadi kenyataan di bash dengan melakukan:
while true; do
test_condition && break
sleep 1
done
Tapi itu menciptakan 1 sub-proses di setiap iterasi (tidur). Saya bisa menghindarinya dengan melakukan:
while true; do
test_condition && break
done
Tetapi menggunakan banyak CPU (sibuk menunggu). Untuk menghindari sub-proses dan menunggu sibuk, saya datang dengan solusi di bawah, tapi saya merasa jelek:
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.
Catatan: dalam kasus umum, saya tidak bisa begitu saja menggunakan read -t 1 var
tanpa fifo, karena akan mengkonsumsi stdin, dan tidak akan berfungsi jika stdin bukan terminal atau pipa.
Bisakah saya menghindari sub-proses dan sibuk menunggu dengan cara yang lebih elegan?
true
, pertanyaan diperbarui.
read -t 1 var
.
sleep
seperti pada contoh pertama. Yang kedua, meskipun mungkin berhasil, tidak akan mudah bagi siapa pun untuk menyesuaikan diri di masa depan. Kode sederhana juga memiliki potensi lebih besar untuk aman.
true
adalah builtin dan tidak membuat sub proses dalam bash. penantian yang sibuk akan selalu buruk.