Necesitaba un temporizador que comenzara al principio de la secuencia de comandos y se detiene al final.
Comentarios
Respuesta
Si quieres la duración en segundos, en la parte superior usa
start=$SECONDS
y al final
duration=$(( SECONDS - start ))
Comentarios
- ¿Qué pasa si toma más de segundos?
- @Pithikos Ver Philip Gibbons ' respuesta a continuación
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
- Sepa el
time
que está utilizando. hackernoon.com/…
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
time
(time ./script.sh), para imprimir el tiempo actual use el comandodate
y así sucesivamente.time yourprogram.sh
, que @Marius Cotofana explicó