С 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
я не вижу ничего, что происходит, что очевидно, поскольку вторая команда уже выполнена