Come usare un timer in bash?


30

Avevo bisogno di un timer che inizierà all'inizio della sceneggiatura e si fermerà alla fine.


2
per favore, scrivi un obiettivo che vuoi raggiungere. per misurare il tempo di lavoro dello script usare il timecomando (time ./script.sh), per stampare il tempo corrente usare il datecomando e così via.
precipita il


Usa linux cmd di base time yourprogram.sh, che ha spiegato @Marius Cotofana
Martijn van Wezel

Risposte:



23

È possibile utilizzare il timecomando integrato di Linux . Dalla pagina man:

time COMMAND [argomenti]

time determina quali informazioni visualizzare sulle risorse utilizzate dal COMANDO dalla stringa FORMAT. Se nella riga di comando non viene specificato alcun formato, ma viene impostata la variabile d'ambiente TIME, il suo valore viene utilizzato come formato.

Per cronometrare lo cleanup.shscript, utilizzare:

$ time cleanup.sh

1
Sappi timeche stai usando. hackernoon.com/…
km6zla

8

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 impiega a funzionare qualcosa.

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

Metti SECONDS=0prima di tutto ciò che stai controllando il tempo di esecuzione di. Deve essere dopo qualsiasi input dell'utente per ottenere un buon risultato, quindi se stai richiedendo informazioni, inseriscile dopo il / i prompt.

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

echo "Completed in $SECONDS seconds"

Come 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

3
Una scorciatoia per coloro che non vogliono una formattazione del tempo così elaborata: date +%T -d "1/1 + $SECONDS sec"(limitato a meno di 24 ore, ma è anche possibile adattarsi per aggiungere giorni)
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}'

1
Ciao, benvenuto su Unix SE! Le risposte di solo codice non sembrano molto buone, forse potresti spiegare cosa sta facendo il tuo script.
Peter dice di reintegrare Monica il

0

@anask fare una soluzione intelligente per questa risposta, solo io consiglio di usare il nativo $SECONDSinvece 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 della printfdivisione e è quello di convertire i secondi trascorsi nelle corrispondenti unità Ore, Minuti, Secondi, rispettivamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.