ฉันรู้ว่าฉันสามารถรอเงื่อนไขที่จะกลายเป็นจริงในการทุบตีโดยทำ:
while true; do
test_condition && break
sleep 1
done
แต่จะสร้างกระบวนการย่อย 1 กระบวนการในการทำซ้ำแต่ละครั้ง (sleep) ฉันสามารถหลีกเลี่ยงพวกเขาโดยทำ:
while true; do
test_condition && break
done
แต่มันใช้ CPU เป็นจำนวนมาก (กำลังรอไม่ว่าง) เพื่อหลีกเลี่ยงกระบวนการย่อยและการรอคอยไม่ว่างฉันจึงตัดสินใจแก้ปัญหาดังกล่าว แต่ฉันพบว่ามันน่าเกลียด
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
เป็น builtin และไม่สร้างกระบวนการย่อยใน bash การรอคอยที่วุ่นวายจะไม่ดีตลอดไป