Wie benutzt man einen Timer in Bash?

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 Befehl date 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

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

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 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.