W przypadku, gdy ktoś używa innych niż muszle bash
, ksh93
i zsh
mają zmiennoprzecinkowe $SECONDS
zmienną jeśli zrobić typeset -F SECONDS
, które mogą być przydatne do pomiaru czasu z dokładnością:
$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed
Od wersji 4.3.13 (2011) w module zsh
znajduje się $EPOCHREALTIME
specjalna zmienna zmiennoprzecinkowa zsh/datetime
:
$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993
Zauważ, że pochodzi od dwóch liczb całkowitych (dla sekund i nanosekund) zwróconych przez clock_gettime()
. W większości systemów jest to większa precyzja, niż double
może pomieścić pojedyncza liczba zmiennoprzecinkowa C , więc stracisz precyzję, gdy użyjesz jej w wyrażeniach arytmetycznych (z wyjątkiem dat w pierwszych miesiącach 1970 r.).
$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064
Aby obliczyć różnice czasowe o wysokiej precyzji (wątpię, byś potrzebował więcej niż milisekundowej precyzji), możesz $epochtime
zamiast tego użyć specjalnej tablicy (która zawiera sekundy i nanosekundy jako dwa osobne elementy).
Od wersji 5.7 (2018) strftime
wbudowana powłoka obsługuje także %N
format nanosekundowy à la GNU date
i a, %.
aby określić precyzję, więc liczbę milisekund od epoki można również odzyskać za pomocą:
zmodload zsh/datetime
strftime %s%3. $epochtime
(lub przechowywane w zmiennej z -s var
)