¿Cómo puedo mostrar un temporizador de cuenta regresiva en tiempo real en el terminal de Linux? ¿Existe una aplicación existente o, mejor aún, una línea para hacer esto?
fuente
¿Cómo puedo mostrar un temporizador de cuenta regresiva en tiempo real en el terminal de Linux? ¿Existe una aplicación existente o, mejor aún, una línea para hacer esto?
No estoy seguro de por qué lo necesita beep
, si todo lo que quiere es un cronómetro, puede hacer esto:
while true; do echo -ne "`date`\r"; done
Eso le mostrará los segundos que pasan en tiempo real y puede detenerlo con Ctrl+ C. Si necesita mayor precisión, puede usar esto para darle nanosegundos:
while true; do echo -ne "`date +%H:%M:%S:%N`\r"; done
Finalmente, si realmente quieres el "formato de cronómetro", donde todo comienza en 0 y comienza a crecer, puedes 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 pidió 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 usando las funciones bash (o el shell que prefiera). En bash, agregue estas líneas a su ~/.bashrc
(esto 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
}
Luego puede iniciar un temporizador de cuenta regresiva de un minuto ejecutando:
countdown 60
Puede realizar una cuenta regresiva de dos horas con:
countdown $((2*60*60))
o un día entero usando:
countdown $((24*60*60))
Y comience el cronómetro ejecutando:
stopwatch
Si necesita poder lidiar con días, horas, minutos y segundos, puede 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 la stopwatch
función no se ha probado durante días, ya que realmente no quería esperar 24 horas. Debería funcionar, pero avíseme si no es así.
.zshrc
derecha después de leer su respuesta. Hoy usécountdown
la primera vez y noté un uso bastante alto de la CPU. Agregué unsleep 0.1
(no sé si un tiempo de reposo de un segundo fraccional es compatible con todos los sistemas) que mejoró mucho eso. El inconveniente es, por supuesto, una precisión de visualización menos precisa, pero puedo vivir con una desviación máxima. 100ms.bash
, puedo vivir con eso (aunque es más alto de lo que esperaba y también he agregado el sueño a mi propio .bashrc).date +%s
- $ date1)) +% H:% M:% S) ";echo -ne "$(date -ju -f %s $(($date1 -
fecha +% s)) +%H:%M:%S)\r"
;play -q -n synth 2 pluck C5
.Mi forma favorita es:
Comienzo:
Detener:
Como @wjandrea comentó a continuación, se ejecutará otra versión:
y presione
Enter
para detenerfuente
time read
time read
falla en zsh, perotime (read)
funciona.Estaba buscando lo mismo y terminé escribiendo algo más elaborado en Python:
Esto te dará una simple cuenta regresiva de 10 segundos:
Fuente: https://github.com/trehn/termdown
fuente
He usado este:
Ejemplo:
Aquí hay una fuente .
fuente
establecer un temporizador para 15 minutos
editar: tenía un montón de enlaces abiertos, y pensé que esto era específico de osx, lo siento. Dejando mi respuesta para que otros estén al tanto de la licencia en los BSD.
fuente
Esto es para un cronómetro con centésimas de segundo:
Ejemplo
fuente
return $1
He combinado la muy buena respuesta del terdon, en una función que al mismo tiempo muestra la hora desde el inicio y el tiempo hasta el final. También hay tres variantes, por lo que es más fácil llamar (no tienes que hacer matemáticas bash), y también es abstracto. Ejemplo de uso :
Y algo así como el temporizador de trabajo:
Y si necesitas un tiempo muy específico:
Aquí está el código para poner en su .bashrc
Combina esto con alguna forma de reproducir sonido en la terminal de Linux ( reproduce archivos mp3 o wav a través de la línea de comando de Linux ) o cygwin (
cat /path/foo.wav > /dev/dsp
funciona para mí en babun / win7) y tienes un temporizador flexible simple con alarma .fuente
Otro enfoque
Para Mac:
Si se quiere una señal cuando llega a cero, se podría construir, por ejemplo, con un comando que devolviera un estado de salida distinto de cero en cero y combinarlo con
watch -b
algo, o algo así, pero si se quiere construir un script más elaborado, esto probablemente sea no es el camino a seguir; es más una solución de tipo "rápido y sucio".Me gusta el
watch
programa en general. Lo vi por primera vez después de haber escrito innumerableswhile sleep 5; do
bucles con diferentes efectos.watch
fue demostrablemente más agradable.fuente
Terminé escribiendo mi propio script de shell: github gist
fuente
Me sorprende que nadie haya usado la
sleepenh
herramienta en sus scripts. En cambio, las soluciones propuestas usan unsleep 1
entre salidas de temporizador posteriores o un bucle ocupado que sale lo más rápido posible. La primera es inadecuada porque debido al poco tiempo que se dedica a imprimir, la salida no se realizará realmente una vez por segundo, sino un poco menos de lo que no es óptimo. Después de que pase suficiente tiempo, el contador saltará un segundo. Este último es inadecuado porque mantiene ocupada la CPU sin una buena razón.La herramienta que tengo en mi se
$PATH
ve así:El script puede usarse como un cronómetro (contando hasta que se interrumpe) o como un temporizador que se ejecuta durante el tiempo especificado. Como
sleep
se usa el comando, este script permite especificar la duración para la cual contar con la misma precisión quesleep
permite. En Debian y derivados, esto incluye durmientes de menos de un segundo y una buena forma legible por humanos para especificar el tiempo. Entonces, por ejemplo, puedes decir:Y como puede ver, el comando se ejecutó exactamente durante 2 minutos y 4.6 segundos sin mucha magia en el guión mismo.
EDITAR :
La herramienta Sleepenh proviene del paquete del mismo nombre en Debian y sus derivados como Ubuntu. Para las distribuciones que no lo tienen, proviene de https://github.com/nsc-deb/sleepenh
La ventaja de Sleepenh es que es capaz de tener en cuenta el pequeño retraso que se acumula con el tiempo por el procesamiento de otras cosas además del sueño durante un ciclo. Incluso si uno solo realizara
sleep 1
un bucle 10 veces, la ejecución general tomaría un poco más de 10 segundos debido a la pequeña sobrecarga que proviene de ejecutarsleep
e iterar el bucle. Este error se acumula lentamente y con el tiempo hará que nuestro cronómetro sea cada vez más impreciso. Para solucionar este problema, cada iteración del ciclo debe calcular el tiempo preciso para dormir, que generalmente es un poco menos de un segundo (para temporizadores de intervalo de un segundo). La herramienta Sleepenh hace esto por usted.fuente
sleep 0.1
. ¿Qué essleepnh
(no puedo encontrarlo en los repositorios de Arch) y en qué se diferenciasleep
? Por lo que puedo decir, básicamente estás haciendo lo mismo que mi respuesta anterior. ¿Qué me estoy perdiendo?sleep 5
es que no duermes exactamente 5 segundos. Pruebe por ejemplotime sleep 5
y verá que ejecutar el comando tarda un poco más de 5 segundos. Con el tiempo se acumulan los errores. La utilidad sleepenh permite evitar fácilmente esta acumulación de errores.sleepnh
es mejor quesleep
(solo dice que otras respuestas usansleep 1
, que no lo hacen) , solo el OP usa eso) y ii) dónde obtenerlo y cómo instalarlo, ya que no es una herramienta estándar.sleep
ysleepenh
en el primer párrafo. De todos modos, probablemente no estaba lo suficientemente claro sobre eso, así que me expandí más al final. Los problemas de precisión de milisegundos son los que se obtienen al llamarsleep
una vez. Se acumulan con el tiempo y en algún momento es notable. No dije que otros solo usansleep 1
. Dije que usansleep 1
o un busyloop. Lo que aún hacen. Muéstrame un contraejemplo. Las respuestas que hacensleep 0.1
son las mismas que las que hacen,sleep 1
excepto que acumulan errores aún más rápido.Respuesta corta:
Explicación:
Sé que hay muchas respuestas, pero solo quiero publicar algo muy cercano a la pregunta de OP, que personalmente aceptaría como " cuenta regresiva en línea en la terminal ". Mis metas fueron:
Cómo funciona:
seq
imprime números del 60 al 1.echo -ne "\r$i "
devuelve el cursor al comienzo de la cadena e imprime el$i
valor actual . Espacio después de que se requiere para sobrescribir el valor anterior, si fue más largo en caracteres que el actual$i
(10 -> 9).fuente
Para referencia futura, existe una herramienta de línea de comando llamada µTimer con opciones de línea de comando muy sencillas para un temporizador de cuenta regresiva / cuenta regresiva.
fuente
Imagina que eres una persona en OSX que busca un cronómetro de línea de comandos. Imagina que no quieres instalar las herramientas de GNU y solo quieres ejecutar con el Unix
date
en ese caso, haga lo que dice @terdon pero con esta modificación:
fuente
Simplemente use watch + date en hora UTC. También puede instalar algún paquete para pantalla grande ...
¡Intentalo!
Ver también http://www.cyberciti.biz/faq/create-large-colorful-text-banner-on-screen/
fuente
sw es un cronómetro simple que funcionará para siempre.
Instalar en pc
Uso
fuente
Un ejemplo de python:
fuente
Eche un vistazo a TermTime , es un buen reloj y cronómetro basado en terminal:
pip install termtime
fuente
Esto es similar a la respuesta aceptada, pero terdon
countdown()
me dio errores de sintaxis. Sin embargo, este funciona muy bien para mí:function timer() { case "$1" in -s) shift;; *) set $(($1 * 60));; esac; local S=" "; for i in $(seq "$1" -1 1); do echo -ne "$S\r $i\r"; sleep 1; done; echo -e "$S\rTime's up!"; }
Puede ponerlo
.bashrc
y luego ejecutarlo con:timer t
(donde t es tiempo en minutos).fuente
Encontré esta pregunta hoy, cuando buscaba una aplicación de término para mostrar un temporizador de cuenta regresiva grande para un taller. Ninguna de las sugerencias era exactamente lo que necesitaba, por lo que rápidamente puse otra en Go: https://github.com/bnaucler/cdown
Como la pregunta ya está suficientemente respondida, considere que esto es por el bien de la posteridad.
fuente
$ sleep 1500 && xterm -fg amarillo -g 240x80 &
Cuando ese gran terminal con texto amarillo salta, ¡es hora de levantarse y estirarse!
Notas: - 1500 segundos = pomodoro de 25 minutos - 240x80 = tamaño de terminal con fila de 240 caracteres y 80 filas. Llena una pantalla para mí notablemente.
Crédito: http://www.linuxquestions.org/questions/linux-newbie-8/countdown-timer-for-linux-949463/
fuente
Una versión GUI del cronómetro
fuente
Si desea un programa compilable por cualquier razón, lo siguiente funcionaría:
Esto se puede usar en otros programas también y se puede portar fácilmente, si un entorno bash no está disponible o simplemente prefiere usar un programa compilado
github
fuente