За допомогою 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я не бачу нічого, що відбувається, що очевидно, оскільки друга команда вже виконується