Como usar um timer no bash?

30

Eu precisava de um cronômetro que iniciasse no começo do script e terminasse no final.

MiNdFrEaK
fonte
2
por favor, escreva uma meta que você deseja alcançar. para medir o tempo de trabalho do script, use o timecomando (time ./script.sh), para imprimir o horário atual, use o datecomando e assim por diante.
apressar
stackoverflow.com/questions/3840558/…
Ciro Santilli escreveu:
Use o cmd básico do linux time yourprogram.sh:, que Marius Cotofana explicou
Martijn van Wezel

Respostas:

29

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

start=$SECONDS

e no final

duration=$(( SECONDS - start ))
Glenn Jackman
fonte
E se demorar mais de segundos?
Pithikos
@Pithikos Veja a resposta de Philip Gibbons abaixo
xhienne
23

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

time COMMAND [argumentos]

time determina quais informações serão exibidas sobre os recursos usados ​​pelo COMMAND a partir da string FORMAT. Se nenhum formato for especificado na linha de comandos, mas a variável de ambiente TIME estiver configurada, seu valor será usado como o formato.

Para cronometrar o cleanup.shscript, use:

$ time cleanup.sh
Marius Cotofana
fonte
11
Saiba o que timevocê está usando. hackernoon.com/...
km6zla
8

Sei que essa é uma pergunta bastante antiga, mas é dessa maneira que faço para qualquer coisa quando quero / preciso saber quanto tempo levou para ser executado.

O Bash possui um timer de segundos embutido na forma de uma variável interna chamada SECONDS(consulte: aqui para outras variáveis ​​internas)

Coloque SECONDS=0antes do que você está verificando o tempo de execução. Ele precisa estar atrás de qualquer entrada do usuário para obter um bom resultado; portanto, se você estiver solicitando informações, coloque-a 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ê deseja apenas saber o tempo em segundos, pode simplificar o acima para:

echo "Completed in $SECONDS seconds"

Como um 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
Philip Gibbons
fonte
3
Um atalho para aqueles que não querem um momento tão elaborada formatação: date +%T -d "1/1 + $SECONDS sec"(limitada a menos de 24 horas, mas você pode adaptar para adicionar dias também)
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
fonte
11
Olá, seja bem-vindo ao Unix SE! As respostas somente de código não parecem muito bem; talvez você possa explicar o que seu script está fazendo.
peterh diz restabelecer Monica
0

@anask faça uma solução inteligente para esta resposta, só recomendo usar o nativo $SECONDSpara criar uma nova

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}'

O objetivo da printfdivisão e é converter os segundos decorridos na unidade correspondente Horas, Mins, Segs, respectivos.

Alex Galindo
fonte