В случае, если кто-то использует другие оболочки, кроме bash
, ksh93
и zsh
имеет $SECONDS
переменную с плавающей запятой, если вы делаете a, typeset -F SECONDS
что может быть удобно для измерения времени с точностью:
$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed
Начиная с версии 4.3.13 (2011) в модуле zsh
есть $EPOCHREALTIME
специальная переменная с плавающей точкой zsh/datetime
:
$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993
Обратите внимание, что это происходит от двух целых чисел (для секунд и наносекунд), возвращаемых clock_gettime()
. В большинстве систем это больше точности, чем double
может удерживать одно число с плавающей запятой C , поэтому вы потеряете точность, если будете использовать его в арифметических выражениях (за исключением дат в первые несколько месяцев 1970 года).
$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064
Чтобы вычислить разницу во времени с высокой точностью (хотя я сомневаюсь, что вам потребуется точность с точностью до миллисекунды), вы можете $epochtime
вместо этого использовать специальный массив (который содержит секунды и наносекунды в качестве двух отдельных элементов).
Начиная с версии 5.7 (2018) strftime
встроенная оболочка также поддерживает %N
наносекундный формат, например, GNU date
и a, %.
для указания точности, поэтому число миллисекунд с начала эпохи также можно получить с помощью:
zmodload zsh/datetime
strftime %s%3. $epochtime
(или хранится в переменной с помощью -s var
)