Ich schreibe ein Skript in Bash, um die Zeit zu berechnen, die für die Ausführung meiner Befehle vergangen ist. Beachten Sie:
STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."
Ich denke, meine Logik ist korrekt, aber am Ende habe ich den folgenden Ausdruck:
"Es dauert Sekunden, um diese Aufgabe abzuschließen ..."
Stimmt etwas mit meiner String-Bewertung nicht?
Ich glaube, Bash-Variablen sind untypisiert. Ich würde mich freuen, wenn es in Bash trotzdem eine "String to Integer" -Methode gibt.
Ich finde es sehr sauber, die interne Variable "$ SECONDS" zu verwenden.
SECONDS=0 ; sleep 10 ; echo $SECONDS
quelle
$SECONDS
funktioniert in der Tat für / bin / bash. Es funktioniert nicht für / bin / dash, die Standard-Shell in Debian und Ubuntu.sleep 0.5
oben verwenden, ist das Ergebnis manchmal 0, manchmal 1 (zumindest nach Bash 5.0.3).Sie versuchen, die Nummer in
ENDTIME
als Befehl auszuführen . Sie sollten auch einen Fehler wie sehen1370306857: command not found
. Verwenden Sie stattdessen die arithmetische Erweiterung :Sie können die Befehle auch in einem separaten Skript speichern
commands.sh
und den Befehl time verwenden:quelle
Sie können das
time
Schlüsselwort von Bash hier mit einer geeigneten Formatzeichenfolge verwendenFolgendes sagt
TIMEFORMAT
die Referenz :quelle
Bei größeren Zahlen möchten wir möglicherweise in einem besser lesbaren Format drucken. Das folgende Beispiel funktioniert genauso wie andere, druckt jedoch auch im "menschlichen" Format:
Einfaches Testen:
Ausgabe:
So verwenden Sie ein Skript wie in anderen Beiträgen beschrieben (erfassen Sie den Startpunkt und rufen Sie die Funktion mit der Endzeit auf:
quelle
Versuchen Sie den folgenden Code:
quelle
Dies ist eine einzeilige Alternative zu Mike Qs Funktion:
quelle
SECONDS
der Antwort von Lon Kaut kombinieren und bedenken, dass $ / $ {} für arithmetische Variablen nichtecho "$((SECONDS/3600))h $(((SECONDS/60)%60))m $((SECONDS%60))s"
Versuchen Sie, die Zeit mit der Option "Verstrichene Sekunden" zu verwenden:
/usr/bin/time -f%e sleep 1
unter bash.oder
\time -f%e sleep 1
in interaktiver Bash.Siehe die Zeitmanpage:
und
quelle
/bin/time
wird hier nicht funktionieren: OP erwähnt einen Block . Wir brauchen also wirklich das Schlüsselworttime
hier.quelle
quelle