No olvides que en la informática un problema casi siempere suele tener diversas soluciones, no obstante nosotros mostramos lo mejor y más óptimo.
Solución:
No estoy seguro de por qué necesitas beep
. Si todo lo que quieres es un cronómetro, puedes hacer esto:
while true; do echo -ne "`date`r"; done
Eso te mostrará los segundos que pasan en tiempo real y puedes detenerlo con Control+C. Si necesita mayor precisión, puede usar esto para obtener nanosegundos:
while true; do echo -ne "`date +%H:%M:%S:%N`r"; done
Finalmente, si realmente desea un “formato de cronómetro”, donde todo comienza en 0 y comienza a crecer, podría hacer algo como esto:
date1=`date +%s`; while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)r";
done
Para un temporizador de cuenta regresiva (que no es lo que solicitó su pregunta original), puede hacer esto (cambiar los segundos en consecuencia):
seconds=20; date1=$((`date +%s` + $seconds));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s` )) +%H:%M:%S)r";
done
Puede combinarlos en comandos simples mediante el uso de funciones bash (o el shell que prefiera). En bash, agregue estas líneas a su ~/.bashrc
(la sleep 0.1
hará que el sistema espere 1/10 de segundo entre cada ejecución para que no envíe spam a su CPU):
function countdown()
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)r";
sleep 0.1
done
function stopwatch()
date1=`date +%s`;
while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)r";
sleep 0.1
done
A continuación, puede iniciar un temporizador de cuenta regresiva de un minuto ejecutando:
countdown 60
Puedes hacer una cuenta regresiva de dos horas con:
countdown $((2*60*60))
o un día entero usando:
countdown $((24*60*60))
E inicia el cronómetro ejecutando:
stopwatch
Si necesita poder manejar días además de horas, minutos y segundos, podría hacer algo como esto:
countdown()
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
## Is this more than 24h away?
days=$(($(($(( $date1 - $(date +%s))) * 1 ))/86400))
echo -ne "$days day(s) and $(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)r";
sleep 0.1
done
stopwatch()
date1=`date +%s`;
while true; do
days=$(( $(($(date +%s) - date1)) / 86400 ))
echo -ne "$days day(s) and $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)r";
sleep 0.1
done
Tenga en cuenta que el stopwatch
La función no se ha probado durante días porque realmente no quería esperar 24 horas para ello. Debería funcionar, pero por favor avíseme si no funciona.
Mi forma favorita es:
Comienzo:
time cat
Detenerse:
ctrl+c
Como @wjandrea comentó a continuación, se debe ejecutar otra versión:
time read
y presiona Enter
para detener
Estaba buscando lo mismo y terminé escribiendo algo más elaborado en Python:
Esto le dará una cuenta regresiva simple de 10 segundos:
sudo pip install termdown
termdown 10
Fuente: https://github.com/trehn/termdown
Ten en cuenta difundir esta crónica si te valió la pena.