Você poderia fazer um monte de trabalho com cálculos matemáticos para que você não tenha que gastar a cada poucos segundos, mas você provavelmente iria querer trabalhar em algum tipo de sincronizador de vez em quando para garantir que o tempo fosse mantido bem.
O loop abaixo apenas define alguns valores iniciais para $h
, $m
e $s
, em seguida, decrementa uma vez a cada 15 segundos e imprime uma linha de contagem regressiva no canto superior esquerdo da tela do terminal (linha 1, coluna 1, 3[Home
) . Você pode fazer o plano de fundo sem problemas, mas você provavelmente desejaria salvá-lo com outro trap
s primeiro se ele fosse executado por algum tempo.
(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 "373[H3[KT- %02d : %02d : %02d38" \
"$h" "$((m?m:60))" "$((s?s:60))"
done) &
A linha impressa é semelhante a esta aqui ...
T- 22 : 49 : 60
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ % (
h=23 m=1 s=60; trap '' TTOU
Na verdade, eu esqueci que ele ainda estava em execução, mas ele continuará a desenhar no mesmo lugar se o terminal não rolar, assim ...
T- 22 : 48 : 30
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ % (
h=23 m=1 s=60; trap '' TTOU
Mas se o terminal rolar a linha, a tela será rolada para fora da tela, até que, no máximo, 15 segundos e ela imprima outra. As fugas utilizadas são normalmente interpretadas como sc
(savecursor: 37
) , hr
(linha de início: 3[H
) , kl
(kill line: 3[K
) e rc
(cursor de restauração: 38
) . Se algum destes não funcionar para você, você deve verificar com tput
para seus valores. Basicamente, a posição do cursor é primeiro salva, depois movida para o topo da tela do terminal, a linha superior é apagada e a contagem regressiva é impressa. A posição do cursor é restaurada.
Funciona equilibrando os decrementos.
Como ...
h - !(m - !(s - s < 60 ? 15 : -45 ) && !s )
... há um pouco mais do que isso, mas o método é apenas para subtrair um de um valor maior quando um valor menor diminui para 0. Assim, quando o valor de segundos diminui de 1 para 0, o valor de minutos também diminui - e quando ambos minutos e segundos são zero, também diminui o valor das horas.
Quando o loop termina ... nada acontece. Eu realmente não sei o que você quer fazer, mas o que quer que seja, você deve colocar depois do done
lá.
Você deve ser capaz de iniciar $h
$m
e $s
em praticamente qualquer valor, mas, conforme escrito, o valor $s
econds deverá diminuir em intervalos de 15 segundos <(> é facilmente alterado) . De qualquer forma, apenas tenha isso em mente.