Wie benutze ich einen Timer in Bash?

30

Ich brauchte einen Timer, der ganz am Anfang des Skripts startet und am Ende stoppt.

MiNdFrEaK
quelle
2
Bitte schreiben Sie ein Ziel, das Sie erreichen wollen. Zum Messen der timeSkriptarbeitszeit verwenden Sie den Befehl (time ./script.sh), zum Ausdrucken der aktuellen Zeit den dateBefehl usw.
Ansturm
Verwenden Sie grundlegende Linux time yourprogram.shcmd:, dass @Marius Cotofana erklärt
Martijn van Wezel

Antworten:

29

Wenn Sie die Dauer in Sekunden wünschen, verwenden Sie oben

start=$SECONDS

und am Ende

duration=$(( SECONDS - start ))
Glenn Jackman
quelle
Was ist, wenn es länger als Sekunden dauert?
Pithikos
@ Pithikos Siehe Philip Gibbons Antwort unten
Xhienne
23

Sie können den in Linux integrierten timeBefehl verwenden. Von der Manpage:

time COMMAND [Argumente]

time bestimmt anhand der Zeichenfolge FORMAT, welche Informationen zu den vom COMMAND verwendeten Ressourcen angezeigt werden sollen. Wenn in der Befehlszeile kein Format angegeben ist, aber die Umgebungsvariable TIME festgelegt ist, wird der Wert als Format verwendet.

cleanup.shVerwenden Sie zum zeitlichen Festlegen des Skripts Folgendes:

$ time cleanup.sh
Marius Cotofana
quelle
1
Wissen timeSie, was Sie verwenden. hackernoon.com/…
km6zla
8

Mir ist klar, dass dies eine ziemlich alte Frage ist, aber so mache ich es für alles, wenn ich wissen möchte / muss, wie lange etwas gedauert hat, um zu laufen.

Bash hat einen eingebauten Sekunden-Timer in Form einer internen Variablen namens SECONDS(siehe: hier für andere interne Variablen)

Stellen Sie SECONDS=0vor was auch immer Sie die Laufzeit von überprüfen. Es muss nach jeder Benutzereingabe erfolgen, um ein gutes Ergebnis zu erhalten. Wenn Sie also zur Eingabe von Informationen aufgefordert werden, setzen Sie diese nach die Eingabeaufforderung (en).

Dann setzen Sie dies am Ende dessen, was Sie überprüfen:

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

Wenn Sie nur die Zeit in Sekunden wissen möchten, können Sie das oben Gesagte vereinfachen, um:

echo "Completed in $SECONDS seconds"

Als Beispiel:

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
quelle
3
Eine Abkürzung für diejenigen, die keine so aufwändige Zeitformatierung wünschen: date +%T -d "1/1 + $SECONDS sec"(auf weniger als
24 Stunden
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
quelle
1
Hallo, willkommen auf der Unix SE! Nur-Code-Antworten sehen nicht besonders gut aus. Vielleicht können Sie erklären, was Ihr Skript tut.
Peter sagt wieder Monica
0

@anask mache eine clevere Lösung für diese Antwort, nur empfehle ich, die native zu $SECONDSverwenden, um eine neue zu erstellen

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

Der Zweck der printfund der Division besteht darin, die verstrichenen Sekunden in die entsprechende Einheit Stunden, Minuten, Sekunden umzuwandeln.

Alex Galindo
quelle