Dzięki dd
niemu możesz niezawodnie odczytać pojedynczy bajt z pliku. Za pomocą stty
można ustawić min
liczbę bajtów, aby zakwalifikować terminal do odczytu i do time
dziesiątych części sekundy. Po połączeniu tych dwóch elementów możesz to zrobić sleep
całkowicie, myślę, i pozwól, aby limit czasu odczytu terminala wykonał pracę za Ciebie:
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
To jest mała przykładowa while
pętla, którą przygotowałem, abyś mógł ją wypróbować. Co dwie sekundy dd
kończy się próba odczytania stdin
- przekierowanie z /dev/tty
- i while
pętli pętli. To lub dd
nie kończy się, ponieważ naciskasz klawisz - w takim przypadku wywoływana jest interaktywna powłoka.
Oto przebieg testowy - liczby wydrukowane na początku każdego wiersza są wartością zmiennej powłoki $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
i naciśnij klawisze CTRL + Z, aby zatrzymać, wykonaj polecenienotify-send hello
. jeśli wykonywane jest drugie polecenie, dlaczego pierwszy proces zostaje zatrzymany? potem, jeśli typfg
i nie mogę zobaczyć, co się dzieje, co jest oczywiste, ponieważ drugie polecenie jest już wykonane