Avec, dd
vous pouvez lire de manière fiable un seul octet à partir d'un fichier. Avec, stty
vous pouvez définir un min
certain nombre d'octets pour qualifier une lecture de terminal et une time
sortie en dixièmes de seconde. Combinez ces deux et vous pouvez vous en passer sleep
entiè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 while
boucle 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 while
boucle 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 hello
et appuie sur CTRL + Z pour arrêter, exécutez -notify-send hello
vous. 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 quefg
je ne vois rien se passe, ce qui est évident, car la deuxième commande est déjà exécutée