Come utilizzare un timer in bash?

Avevo bisogno di un timer che partisse allinizio dello script e si fermasse alla fine.

Commenti

  • per favore, scrivi un obiettivo che desideri raggiungere. per misurare il tempo di lavoro dello script utilizzare il comando time (time ./script.sh), per stampare lora corrente utilizzare il comando date e così via.
  • stackoverflow.com/questions/3840558/…
  • Usa il cmd di linux di base: time yourprogram.sh, che @Marius Cotofana ha spiegato

Answer

Se desideri la durata in secondi, in alto utilizza

start=$SECONDS 

e alla fine

duration=$(( SECONDS - start )) 

Commenti

Risposta

Potresti usare il comando time integrato di Linux. Dalla pagina man:

time COMMAND [argomenti]

time determina quali informazioni visualizzare ay sulle risorse usate dal COMMAND dalla stringa FORMAT. Se non è specificato alcun formato sulla riga di comando, ma è impostata la variabile dambiente TIME, il suo valore viene utilizzato come formato.

Per cronometrare il cleanup.sh script, utilizza:

$ time cleanup.sh 

Commenti

Risposta

Mi rendo conto che questa è una domanda piuttosto vecchia, ma questo è il modo in cui lo faccio per qualsiasi cosa quando voglio / ho bisogno di sapere quanto tempo ci è voluto per eseguire qualcosa.

Bash ha un timer dei secondi incorporato sotto forma di una variabile interna denominata SECONDS (vedi: qui per altre variabili interne)

Metti SECONDS=0 prima di qualunque cosa tu stia controllando il tempo di esecuzione. Deve essere dopo qualsiasi input dellutente per ottenere un buon risultato, quindi se stai chiedendo informazioni, inseriscile dopo i prompt.

Quindi, inserisci questo alla fine di ciò che stai “controllando:

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 desideri conoscere solo il tempo in secondi, puoi semplificare quanto sopra in:

echo "Completed in $SECONDS seconds" 

Ad esempio:

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 

Commenti

  • Una scorciatoia per coloro che non Non voglio una formattazione dellora così elaborata: date +%T -d "1/1 + $SECONDS sec" (limitato a meno di 24 ore, ma puoi anche adattarti per aggiungere giorni)
  • Ottimo collegamento alle TLDP ' s variabili interne . Grazie per questo!

Risposta

#!/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}" 

Commenti

  • Ciao, benvenuto in Unix SE! Le risposte di solo codice don ' t sembrano molto buone, forse potresti spiegare cosa sta facendo il tuo script.
  • Perché moltiplichi per 1000 qui e poi dividi per 1000 * modificatore più tardi per tutti i valori visualizzati?

Answer

@anask fa una soluzione intelligente per questo risposta, ti consiglio solo di utilizzare il nativo $SECONDS invece di crearne uno nuovo

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

Lo scopo del printf e la divisione deve convertire i secondi trascorsi nellunità corrispondente ore, minuti, secondi, rispettivamente.

Risposta

Recentemente ho “provato qualcosa di simile. Suggerirei:

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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *