¿Cómo usar un temporizador en bash?

Necesitaba un temporizador que comenzara al principio de la secuencia de comandos y se detiene al final.

Comentarios

  • por favor, escriba un objetivo que desee alcanzar. para medir el tiempo de trabajo del script, use el comando time (time ./script.sh), para imprimir el tiempo actual use el comando date y así sucesivamente.
  • stackoverflow.com/questions/3840558/…
  • Usa cmd básico de Linux: time yourprogram.sh, que @Marius Cotofana explicó

Respuesta

Si quieres la duración en segundos, en la parte superior usa

start=$SECONDS 

y al final

duration=$(( SECONDS - start )) 

Comentarios

Respuesta

Puede usar el comando time integrado de Linux. Desde la página de manual:

tiempo COMANDO [argumentos]

el tiempo determina qué información mostrar ay sobre los recursos utilizados por el COMANDO de la cadena FORMATO. Si no se especifica ningún formato en la línea de comando, pero se establece la variable de entorno TIME, su valor se utiliza como formato.

Para cronometrar el cleanup.sh script, use:

$ time cleanup.sh 

Comentarios

Responder

Me doy cuenta de que esta es una pregunta bastante antigua, pero así es como lo hago para cualquier cosa cuando quiero / necesito saber cuánto tiempo tardó en ejecutarse algo.

Bash tiene un temporizador de segundos incorporado en forma de una variable interna llamada SECONDS (ver: aquí para otras variables internas)

Ponga SECONDS=0 antes de lo que sea que esté verificando el tiempo de ejecución. Debe ser después de cualquier entrada del usuario para obtener un buen resultado, por lo que si está solicitando información, colóquela después de los mensajes.

Luego, coloque esto al final de lo que está verificando:

if (( $SECONDS > 3600 )) ; then let "hours=SECONDS/3600" let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" elif (( $SECONDS > 60 )) ; then let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $minutes minute(s) and $seconds second(s)" else echo "Completed in $SECONDS seconds" fi 

Si solo desea saber el tiempo en segundos, puede simplificar lo anterior a:

echo "Completed in $SECONDS seconds" 

Como ejemplo:

read -rp "What"s your name? " "name" SECONDS=0 echo "Hello, $name" if (( $SECONDS > 3600 )) ; then let "hours=SECONDS/3600" let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" elif (( $SECONDS > 60 )) ; then let "minutes=(SECONDS%3600)/60" let "seconds=(SECONDS%3600)%60" echo "Completed in $minutes minute(s) and $seconds second(s)" else echo "Completed in $SECONDS seconds" fi 

Comentarios

  • Un atajo para aquellos que no No quiero un formato de hora tan elaborado: date +%T -d "1/1 + $SECONDS sec" (limitado a menos de 24 horas, pero también puede adaptarse para agregar días)
  • Excelente enlace a TLDP ' s Variables internas . ¡Gracias por eso!

Respuesta

#!/bin/bash start=$(date +%s) # # do something sleep 10 # # end=$(date +%s) seconds=$(echo "$end - $start" | bc) echo $seconds" sec" echo "Formatted:" awk -v t=$seconds "BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}" 

Comentarios

  • Hola, ¡bienvenido a Unix SE! Las respuestas de solo código no ' no se ven muy bien, tal vez podrías explicar qué está haciendo tu script.
  • ¿Por qué multiplicas por 1000 aquí y luego divides por ¿Modificador 1000 * más tarde para todos los valores mostrados?

Respuesta

@anask hace una solución inteligente para esto respuesta, solo recomiendo usar el $SECONDS nativo en su lugar para crear uno nuevo

awk -v t=$SECONDS "BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}" 

El propósito del printf y la división es convertir los segundos transcurridos a la unidad correspondiente Horas, Minutos, Segundos, respectivamente.

Respuesta

Recientemente he intentado algo similar. Sugeriría:

date1=$(date +%s) #Use this arithmetic to determine elapsed time since defining date1 $(( $(date +%s) - $date1 )) #While loop using timer while ! [ $(( $(date +%s) - $date1 )) -gt 10 ]; do #Terminal timer -n won"t append new line, so the echo will replace itself. ##There is also some date formatting to achieve: HH:MM:SS. echo -ne "$(date -u --date @$(( $(date +%s) - $date1 )) +%H:%M:%S)\r" done 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *