¿Cómo usar un temporizador en bash?

30

Necesitaba un temporizador que comenzará al principio del guión y se detiene al final.

Mente monstruo
fuente
2
por favor, escriba una meta que quiera lograr. para medir el tiempo de trabajo del script use el timecomando (time ./script.sh), para imprimir el tiempo actual use el datecomando, etc.
prisa el
stackoverflow.com/questions/3840558/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Use cmd básico de Linux: time yourprogram.shque explicó @Marius Cotofana
Martijn van Wezel

Respuestas:

29

Si desea la duración en segundos, en la parte superior use

start=$SECONDS

Y al final

duration=$(( SECONDS - start ))
Glenn Jackman
fuente
¿Qué pasa si lleva más de segundos?
Pithikos
@Pithikos Vea la respuesta de Philip Gibbons a continuación
xhienne
23

Podrías usar el timecomando incorporado de Linux . Desde la página del manual:

comando de tiempo [argumentos]

time determina qué información mostrar sobre los recursos utilizados por el COMANDO desde la cadena FORMAT. 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.shguión, use:

$ time cleanup.sh
Marius Cotofana
fuente
1
Sepa lo timeque está usando. hackernoon.com/…
km6zla
8

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

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

Ponga SECONDS=0antes de lo que sea que esté verificando el tiempo de ejecución. Debe estar después de cualquier entrada del usuario para obtener un buen resultado, por lo que si solicita información, póngala después de la (s) solicitud (es).

Luego, pon esto al final de lo que estás comprobando:

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 para:

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
Philip Gibbons
fuente
3
Un atajo para aquellos que no desean un formato de tiempo tan elaborado: date +%T -d "1/1 + $SECONDS sec"(limitado a menos de 24 h, pero también puede adaptarse para agregar días)
xhienne
1
#!/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}'
anask
fuente
1
Hola, bienvenido en el Unix SE! Las respuestas de solo código no se ven muy bien, tal vez podrías explicar lo que está haciendo tu script.
Peter dice que reinstalar a Monica el
0

@anask hace una solución inteligente para esta respuesta, solo recomiendo usar el nativo en su $SECONDSlugar 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 de printfy la división es convertir los segundos transcurridos a las correspondientes unidades Horas, Mins, Secs, respectivamente.

Alex Galindo
fuente