Eu precisava de um cronômetro que iniciará no início do script e irá parar no final.
Comentários
Resposta
Se você quiser a duração em segundos, no topo use
start=$SECONDS
e no final
duration=$(( SECONDS - start ))
Comentários
- E se levar mais do que segundos?
- @Pithikos Veja Philip Gibbons ' s resposta abaixo
Resposta
Você pode usar o comando time
interno do Linux. Na página de manual:
hora COMMAND [argumentos]
hora determina quais informações serão exibidas ay sobre os recursos usados pelo COMANDO da string FORMAT. Se nenhum formato for especificado na linha de comando, mas a variável de ambiente TIME estiver definida, seu valor será usado como o formato.
Para cronometrar o cleanup.sh
script, use:
$ time cleanup.sh
Comentários
- Conheça o
time
que você está usando. hackernoon.com/…
Resposta
Sei que essa é uma pergunta bem antiga, mas é assim que faço para qualquer coisa quando quero / preciso saber quanto tempo algo leva para ser executado.
Bash tem um temporizador de segundos embutido na forma de uma variável interna chamada SECONDS
(veja: aqui para outras variáveis internas)
Coloque SECONDS=0
antes de tudo o que você “está verificando o tempo de execução. Precisa ser após qualquer entrada do usuário para obter um bom resultado. se você está solicitando informações, coloque-as após o (s) prompt (s).
Então, 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 saber apenas o tempo em segundos, pode simplificar o acima para:
echo "Completed in $SECONDS seconds"
Por 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
Comentários
- Um atalho para quem não t quero uma formatação de tempo tão elaborada:
date +%T -d "1/1 + $SECONDS sec"
(limitado a menos de 24h, mas você pode se adaptar para adicionar dias também) - Excelente link para TLDP ' s Variáveis internas . Obrigado por isso!
Resposta
#!/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}"
Comentários
- Olá, bem-vindo ao Unix SE! Respostas somente de código não ' parecem muito bem, talvez você pudesse explicar o que seu script está fazendo.
- Por que você multiplica por 1000 aqui e depois divide por Modificador 1000 * mais tarde para todos os valores exibidos?
Resposta
@anask faz uma solução inteligente para isso resposta, apenas recomendo usar o $SECONDS
nativo em vez de criar um novo
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 do printf
e a divisão deve converter os segundos decorridos na unidade correspondente Horas, minutos, segundos, respectivamente.
Resposta
Tenho tentado algo semelhante recentemente. Sugiro:
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 o tempo atual, use o comandodate
e assim por diante.time yourprogram.sh
, que @Marius Cotofana explicou