Ich möchte ein Bash-Skript erstellen, das die Startzeit eines Browsers misst, für das ich einen HTML-Code verwende, der den Zeitstempel in Millisekunden mithilfe von JavaScript beim Laden abruft.
Im Shell-Skript, kurz bevor ich den Browser aufrufe, erhalte ich den Zeitstempel mit:
date +%s
Das Problem ist, dass es den Zeitstempel in Sekunden erhält, und ich brauche ihn in Millisekunden, da der Browser manchmal, wenn er ein zweites Mal ausgeführt wird, in weniger als einer Sekunde startet und ich in der Lage sein muss, diese Zeit präzise mit Millisekunden anstelle von Sekunden zu messen.
Wie kann ich den Zeitstempel in Millisekunden aus einem Bash-Skript abrufen?
quelle
$(($(date +'%s * 1000 + %N / 1000000')))
. Das macht noch nicht viel Sinn, wäre aber zuverlässiger.%N
ist in BSD und OS X nicht verfügbar.echo $(( $(date '+%s%N') / 1000000))
?Mit der GNU- oder Ast-Open-Implementierung von
date
(oder busybox ', wenn dieseFEATURE_DATE_NANO
Option aktiviert ist) würde ich Folgendes verwenden:Dies gibt Millisekunden seit der Unix-Epoche zurück.
quelle
%3N
die erforderliche Auffüllung mit der linken Null erfolgt (ohne die Dokumente zu lesen. ;-), kannst duwhile sleep 0.05; do date +%s%3N; done
und ja, die erforderlichen Nullen sind da.%3N
aber in der Tat null gepolstert. Außerdem glaube ich nicht, dass Ihre Lösung Nullen hinzufügen würde, sondern nur die Antwort so wenig verzögern würde.%3N
tatsächlich mit 0 aufgefüllt ist.Falls mit jemand anderen Shells als
bash
,ksh93
undzsh
haben eine Gleitkomma -$SECONDS
Variable , wenn Sie ein tun ,typeset -F SECONDS
was sehr praktisch sein kann , Zeit mit Genauigkeit zu messen:Seit Version 4.3.13 (2011)
zsh
gibt es$EPOCHREALTIME
imzsh/datetime
Modul eine spezielle Gleitkommavariable :Beachten Sie, dass dies von den zwei Ganzzahlen (für Sekunden und Nanosekunden) abgeleitet ist, die von zurückgegeben werden
clock_gettime()
. Auf den meisten Systemen ist dies präziser als eine einzelne C-double
Gleitkommazahl, sodass Sie an Genauigkeit verlieren, wenn Sie sie in arithmetischen Ausdrücken verwenden (mit Ausnahme von Datumsangaben in den ersten Monaten des Jahres 1970).Um Zeitunterschiede mit hoher Genauigkeit zu berechnen (obwohl ich bezweifle, dass Sie eine Genauigkeit von mehr als Millisekunden benötigen würden), möchten Sie möglicherweise
$epochtime
stattdessen das spezielle Array verwenden (das die Sekunden und Nanosekunden als zwei separate Elemente enthält).Seit Version 5.7 (2018) unterstützt die
strftime
eingebaute Shell auch ein%N
Nanosekundenformat à la GNUdate
und ein%.
, um die Genauigkeit anzugeben, sodass die Anzahl der Millisekunden seit der Epoche auch abgerufen werden kann mit:(oder in einer Variablen gespeichert mit
-s var
)quelle
Um Berechnungen zu vermeiden, die Millisekunden benötigen, können Befehlszeilen-JavaScript-Interpreter helfen:
Pakete, die diese Interpreter für Ubuntu Eoan enthalten:
quelle
In bash 5+ gibt es eine Variable mit Mikrosekunde Granularität:
$EPOCHREALTIME
.So:
Gibt die Zeit seit dem 1. Januar 1970 in Millisekunden aus.
Andernfalls müssen Sie das Datum verwenden. Entweder das GNU-Datum:
Eine der in https://serverfault.com/a/423642/465827 aufgeführten Alternativen
Oder
brew install coreutils
für OS XOder, wenn alles andere fehlschlägt, kompilieren Sie (gcc epochInµsec.c) dieses c-Programm (passen Sie es nach Bedarf an):
Beachten Sie, dass das Aufrufen eines externen Programms einige Zeit benötigt, um von der Festplatte gelesen und geladen, gestartet, ausgeführt und schließlich zum Drucken der Ausgabe verwendet zu werden. Das dauert einige Millisekunden. Dies ist die Mindestgenauigkeit, die mit einem externen Werkzeug (einschließlich Datum) erreicht werden kann.
quelle