Con dd
usted puede leer de manera confiable un solo byte de un archivo. Con stty
usted puede establecer un min
número de bytes para calificar una lectura de terminal y una time
salida en décimas de segundo. Combina esos dos y puedes prescindir por sleep
completo, creo, y solo deja que el tiempo de espera de lectura del terminal haga el trabajo por ti:
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
Ese es un pequeño while
bucle de ejemplo que me burlé para que lo pruebes. Cada dos segundos dd
agota su intento de lectura de stdin
- redirigido desde /dev/tty
- y los while
bucles de bucle. Eso o dd
no expira porque presiona una tecla, en cuyo caso se invoca un shell interactivo.
Aquí hay una prueba de funcionamiento: los números impresos en la cabecera de cada línea son el valor de la variable de 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
y presiono CTRL + Z para detener,notify-send hello
me ejecutan. si se ejecuta el segundo comando, ¿cómo se detiene el primer proceso? después de eso si el tipofg
no puedo ver que ocurra algo, lo cual es obvio, ya que el segundo comando ya está ejecutado