Avec, ddvous pouvez lire de manière fiable un seul octet à partir d'un fichier. Avec, sttyvous pouvez définir un mincertain nombre d'octets pour qualifier une lecture de terminal et une timesortie en dixièmes de seconde. Combinez ces deux et vous pouvez vous en passer sleepentièrement, je pense, et laissez simplement le délai de lecture du terminal faire le travail pour vous:
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
C'est une petite whileboucle d' exemple que j'ai simulée pour que vous l'essayiez. Toutes les deux secondes dd, sa tentative de lecture stdin- redirigé depuis /dev/tty- et la whileboucle bouclent. Cela ou dd n'expire pas car vous appuyez sur une touche - auquel cas un shell interactif est appelé.
Voici un test - les nombres imprimés en tête de chaque ligne sont la valeur de la variable 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 helloet appuie sur CTRL + Z pour arrêter, exécutez -notify-send hellovous. si la deuxième commande est exécutée, comment se fait-il que le premier processus soit arrêté? après cela, si le type quefgje ne vois rien se passe, ce qui est évident, car la deuxième commande est déjà exécutée