В случае, если кто-то использует другие оболочки, кроме 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)