Como usar um cronômetro no bash?

Eu precisava de um cronômetro que iniciará no início do script e irá parar no final.

Comentários

  • por favor, escreva uma meta que você deseja alcançar. para medir o tempo de trabalho do script, use o comando time (time ./script.sh); para imprimir o tempo atual, use o comando date e assim por diante.
  • stackoverflow.com/questions/3840558/…
  • Use linux cmd básico: time yourprogram.sh, que @Marius Cotofana explicou

Resposta

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

start=$SECONDS 

e no final

duration=$(( SECONDS - start )) 

Comentários

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

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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *