Como usar um timer no bash?

27

Eu precisava de um temporizador que comece no início do script e pare no final.

    
por MiNdFrEaK 04.11.2012 / 21:40

4 respostas

27

Se você quiser a duração em segundos, no topo use

start=$SECONDS

e no final

duration=$(( SECONDS - start ))
    
por 04.11.2012 / 23:32
20

Você pode usar o comando time interno do Linux. Na página do manual:

time COMMAND [arguments]

time determines which information to display about the resources used by the COMMAND from the string FORMAT. If no format is specified on the command line, but the TIME environment variable is set, its value is used as the format.

Para cronometrar o script cleanup.sh , use:

$ time cleanup.sh
    
por 04.11.2012 / 22:08
5

Eu percebo que essa é uma pergunta muito antiga, mas é assim que faço para qualquer coisa quando quero / preciso saber quanto tempo levei para executar.

Coloque SECONDS=0 antes do que você está verificando o tempo de execução de. Ele precisa ser depois de qualquer entrada do usuário para obter um bom resultado, por isso, se você está solicitando informações, coloque-o após o (s) prompt (s).

Em seguida, coloque isso no final do que você 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

Se você quer saber apenas o tempo em segundos, você pode simplificar o acima para:

echo "Completed in $SECONDS seconds"

Como exemplo:

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
    
por 29.03.2017 / 01:56
0
#!/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}'
    
por 14.06.2018 / 23:21

Tags