¿Hay alguna manera de hacer que los scripts sean dynamics?

Necesito mi script para mostrar el time hasta la próxima ejecución, continuamente como un timer, ¿es esto posible?

Podría hacer gran parte del trabajo con matemática de shell para no tener que bifurcar cada pocos segundos, pero es probable que desee trabajar en algún tipo de sincronizador de vez en cuando para asegurarse de que el time se mantenga bien.

El ciclo siguiente simplemente establece algunos valores iniciales para $h , $m y $s luego disminuye una vez cada 15 segundos e imprime una línea de count regresiva en la parte superior izquierda de la pantalla del terminal (fila 1, columna 1, \033[Home ) Puedes copyrlo sin problemas, pero probablemente quieras protegerlo con otras trap primero si se ejecutara por un time.

 (h=23 m=1 s=60; trap '' TTOU until [ "$(((h-=(!(m-=!(s-=s?15:-45)*(m?1:-59))&&!s))+m+s))" -eq 0 ] do sleep 15 printf "\0337\033[H\033[KT- %02d : %02d : %02d\0338" \ "$h" "$((m?m:60))" "$((s?s:60))" done) & 

La línea que imprime se ve así de arriba …

 T- 22 : 49 : 60 130 mikeserv@localhost ~ % 130 mikeserv@localhost ~ % 130 mikeserv@localhost ~ % ( h=23 m=1 s=60; trap '' TTOU 

De hecho, me olvidé de que todavía estaba funcionando, pero continuará dibujando sobre el mismo lugar si la terminal no se desplaza, así …

 T- 22 : 48 : 30 130 mikeserv@localhost ~ % 130 mikeserv@localhost ~ % 130 mikeserv@localhost ~ % ( h=23 m=1 s=60; trap '' TTOU 

Pero si el terminal se desplaza, su línea se desplazará fuera de la pantalla hasta que transcurran como máximo 15 segundos y se imprime otra. Los escapes utilizados se interpretan comúnmente como sc (savecursor: \0337 ) , hr (fila de inicio: \033[H ) , kl (línea de \0338 : \033[K ) y rc (cursor de restauración: \0338 ) . Si alguno de estos no funciona para usted, debe verificar con tput sus valores. Básicamente, la position del cursor se guarda primero, luego se mueve a la parte superior de la pantalla de la terminal, se borra la línea superior y se imprime la count regresiva. La position del cursor se restaura.

Funciona al equilibrar los decrementos.

Me gusta…

  h - !(m - !(s - s < 60 ? 15 : -45 ) && !s ) 

… hay un poco más que eso, pero el método es solo restar uno de un valor mayor cuando un valor más pequeño disminuye a 0. Entonces, cuando el valor de segundos disminuye de 1 a 0, el valor de minutos también disminuye, y cuando ambos minutos y segundos son cero, por lo que también disminuye el valor de las horas.

Cuando el ciclo se completa … no pasa nada. Realmente no sé qué es lo que quieres que se haga, pero sea lo que sea, deberías meterlo después de lo done allí.

Debería poder comenzar con $h $m $s en prácticamente cualquier valor, pero, según lo escrito, se espera que el valor de $s econds disminuya en intervalos de 15 segundos (aunque eso se modifica fácilmente) . De todos modos, solo tenlo en count.

Algo como

 t=1 until [ "$t" -le 0 ] do t=$(($(date -d '2015-02-24 16:40:00' +'%s')-$(date +'%s'))) sleep 1 tput clear echo $t done