ด้วยdd
คุณสามารถอ่านไบต์เดียวจากไฟล์ได้อย่างน่าเชื่อถือ กับstty
คุณสามารถกำหนดmin
จำนวนไบต์ให้มีคุณสมบัติในการอ่านเทอร์มินัลและtime
ออกเป็นสิบวินาที รวมสองสิ่งนี้เข้าด้วยกันและคุณสามารถทำได้โดยไม่ต้องใช้ความsleep
คิดทั้งหมดและให้เวลาในการอ่านของสถานีทำงานเพื่อคุณ
s=$(stty -g </dev/tty)
(while stty raw -echo isig time 20 min 0;test -z "$(
dd bs=1 count=1 2>/dev/null; stty "$s")" || (exec sh)
do echo "$SECONDS:" do your stuff here maybe
echo no sleep necessary, I think
[ "$((i+=1))" -gt 10 ] && exit
done
) </dev/tty
นั่นเป็นตัวอย่างเล็ก ๆ น้อย ๆwhile
ที่ฉันล้อเลียนเพื่อให้คุณลอง ทุกสองวินาทีdd
หมดเวลากับความพยายามในการอ่านstdin
- เปลี่ยนเส้นทางจาก/dev/tty
- และwhile
ลูปลูป นั้นหรือdd
ไม่หมดเวลาเพราะคุณกดปุ่ม - ในกรณีที่เปลือกโต้ตอบถูกเรียก
นี่คือการทดสอบการทำงาน - ตัวเลขที่พิมพ์ที่ส่วนหัวของแต่ละบรรทัดคือค่าของตัวแปรเชลล์$SECONDS
:
273315: do your stuff here maybe
no sleep necessary, I think
273317: do your stuff here maybe
no sleep necessary, I think
273319: do your stuff here maybe
no sleep necessary, I think
273321: do your stuff here maybe
no sleep necessary, I think
sh-4.3$ : if you press a key you get an interactive shell
sh-4.3$ : this example loop quits after ten iterations
sh-4.3$ : or if this shell exits with a non-zero exit status
sh-4.3$ : and speaking of which, to do so you just...
sh-4.3$ exit
exit
273385: do your stuff here maybe
no sleep necessary, I think
273387: do your stuff here maybe
no sleep necessary, I think
273389: do your stuff here maybe
no sleep necessary, I think
273391: do your stuff here maybe
no sleep necessary, I think
273393: do your stuff here maybe
no sleep necessary, I think
273395: do your stuff here maybe
no sleep necessary, I think
273397: do your stuff here maybe
no sleep necessary, I think
sleep 10; notify-send hello
แล้วกด CTRL + Z เพื่อหยุดnotify-send hello
รับการดำเนินการ หากคำสั่งที่สองได้รับการดำเนินการว่าทำไมกระบวนการแรกหยุดลง? หลังจากนั้นถ้าfg
ฉันพิมพ์ไม่เห็นสิ่งใดเกิดขึ้นซึ่งเห็นได้ชัดตั้งแต่คำสั่งที่สองได้รับการดำเนินการแล้ว