Ich brauchte einen Timer, der ganz am Anfang des Skripts startet und am Ende endet.
Kommentare
- Bitte schreiben Sie ein Ziel, das Sie erreichen möchten. Um die Arbeitszeit des Skripts zu messen, verwenden Sie den Befehl
time
(time ./script.sh), um die aktuelle Zeit auszudrucken, verwenden Sie den Befehldate
und so weiter. - stackoverflow.com/questions/3840558/…
- Verwenden Sie das grundlegende Linux-Cmd:
time yourprogram.sh
, das @Marius Cotofana erklärte
Antwort
Wenn Sie die Dauer in Sekunden angeben möchten, verwenden Sie oben
start=$SECONDS
und am Ende
Kommentare
- Was ist, wenn es länger als Sekunden dauert?
- @Pithikos Siehe Philip Gibbons ' s Antwort unten
Antwort
Sie können den in Linux integrierten Befehl time
verwenden. Auf der Manpage:
Zeit BEFEHL [Argumente]
Zeit bestimmt, welche Informationen angezeigt werden sollen ay über die Ressourcen, die vom BEFEHL aus der Zeichenfolge FORMAT verwendet werden. Wenn in der Befehlszeile kein Format angegeben ist, aber die Umgebungsvariable TIME festgelegt ist, wird ihr Wert als Format verwendet.
Zur Zeiteinstellung von cleanup.sh
Skript, verwenden Sie:
$ time cleanup.sh
Kommentare
- Wissen die
time
, die Sie verwenden. hackernoon.com/…
Antwort
Mir ist klar, dass dies eine ziemlich alte Frage ist, aber so mache ich das für alles, wenn ich wissen möchte / muss, wie lange etwas gedauert hat.
Bash verfügt über einen integrierten Sekunden-Timer in Form einer internen Variablen mit dem Namen SECONDS
(siehe: hier für andere interne Variablen)
Setzen Sie SECONDS=0
vor alles, was Sie zur Überprüfung der Laufzeit von verwenden. Es muss nach jeder Benutzereingabe erfolgen, um ein gutes Ergebnis zu erzielen Wenn Sie zur Eingabe von Informationen auffordern, setzen Sie diese nach die Eingabeaufforderung (en).
Fügen Sie diese am Ende der Überprüfung ein:
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 die Zeit nur in Sekunden wissen möchten, können Sie Folgendes vereinfachen:
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
Kommentare
- Eine Verknüpfung für diejenigen, die nicht möchte keine so aufwändige Zeitformatierung:
date +%T -d "1/1 + $SECONDS sec"
(auf weniger als 24 Stunden begrenzt, aber Sie können sich auch anpassen, um Tage hinzuzufügen) - Hervorragender Link zu TLDP ' s internen Variablen . Vielen Dank dafür!
Antwort
#!/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}"
Kommentare
- Hallo, willkommen auf der Unix SE! Nur-Code-Antworten sehen ' nicht sehr gut aus. Vielleicht können Sie erklären, was Ihr Skript tut.
- Warum multiplizieren Sie hier mit 1000 und dividieren dann durch 1000 * Modifikator später für alle angezeigten Werte?
Antwort
@anask macht eine clevere Lösung dafür Antwort: Ich empfehle nur, stattdessen die native $SECONDS
zu verwenden, 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 printf
und die Division konvertiert die verstrichenen Sekunden in die entsprechenden Einheitsstunden, Minuten, Sekunden bzw..
Antwort
Ich habe kürzlich etwas Ähnliches versucht. Ich würde vorschlagen:
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