Con ddusted puede leer de manera confiable un solo byte de un archivo. Con sttyusted puede establecer un minnúmero de bytes para calificar una lectura de terminal y una timesalida en décimas de segundo. Combina esos dos y puedes prescindir por sleepcompleto, 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 whilebucle de ejemplo que me burlé para que lo pruebes. Cada dos segundos ddagota su intento de lectura de stdin- redirigido desde /dev/tty- y los whilebucles 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 helloy presiono CTRL + Z para detener,notify-send hellome ejecutan. si se ejecuta el segundo comando, ¿cómo se detiene el primer proceso? después de eso si el tipofgno puedo ver que ocurra algo, lo cual es obvio, ya que el segundo comando ya está ejecutadocmd; cmd; cmd;es como escribircmd <newline> cmd <newline> .... Como alternativa a una secuencia de comandos puede escribir( cmd; cmd; cmd; ), que se comportaría como el guión, bacuse del subnivel generada por(sleep 10. cuando presiono CTRL + Z después de 3 segundos y reanudo después de unos segundos y noté que el comando de suspensión murió en menos de 7 segundos. que es opuesto a lo que dijiste, ya que el comando nunca se detiene, simplemente se ejecuta en segundo plano.straceD delsleepmando y descubrí que la llamada al sistema utilizado esnanosleep(). Parece ser un comportamiento definido de lananosleepllamada al sistema.restart_syscall()reinicia la llamada interrumpida del sistema con un argumento de tiempo que se ajusta adecuadamente para tener en cuenta el tiempo que ya ha transcurrido (incluido el tiempo en que el proceso fue detenido por una señal). Lea esa página de manualfg %1:) o en el fondo (ejbg %1.:). (si los trabajos solo dan 1 número, es decir, solo 1 proceso suspendido, como se muestra en el ejemplo de caos: solo[1]+ stopped sleep 10, puede omitir la%nparte. Si hay varios procesos en segundo plano (en ejecución o detenidos), debe designar el que desea con:%n(por ejemplo:fg %2tener% 2 currículum en primer plano))