Với dd
bạn có thể đọc một byte đáng tin cậy từ một tệp. Với stty
bạn có thể thiết lập một min
số byte để đủ điều kiện đọc thiết bị đầu cuối và time
hết trong một phần mười giây. Tôi kết hợp cả hai và bạn có thể làm mà không cần sleep
hoàn toàn, tôi nghĩ, và chỉ để thời gian chờ đọc của thiết bị đầu cuối thực hiện công việc cho bạn:
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
Đó là một while
vòng lặp ví dụ nhỏ mà tôi đã thử để bạn thử. Cứ sau hai giây dd
lại đọc thử stdin
- chuyển hướng từ /dev/tty
- và các while
vòng lặp. Điều đó hoặc dd
không hết thời gian vì bạn nhấn một phím - trong trường hợp đó, một vỏ tương tác được gọi.
Đây là một lần chạy thử - các số được in ở đầu mỗi dòng là giá trị của biến shell $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
và nhấn CTRL + Z để dừng,notify-send hello
hãy thực hiện. Nếu lệnh thứ hai được thực thi thì làm sao quá trình đầu tiên bị dừng? sau đó nếu loạifg
tôi không thể thấy bất cứ điều gì xảy ra, điều đó là hiển nhiên, vì lệnh thứ hai đã được thực thi