Самый простой и чистый вариант — использоватьdate
:
date -ud "@$elapsed" "+Elapsed Time: %T"
Здесь $elapsed
представляет дельту времени в секундах.
Вы можете избежать разветвления внешнего date
процесса, придерживаясь встроенных -модулей оболочки [1][2]. Команда оболочки printf
имеет спецификатор формата даты/времени %(...)T
, который часто упускают из виду :
.
TZ=UTC0 printf "Elapsed Time: %(%T)T\n" $elapsed
TZ=UTC0
и date -u
устанавливают часовой пояс на UTC, что предотвращает любую двусмысленность, связанную с часовым поясом и летним временем.
Поскольку в этом вопросе особое внимание уделяется форматированию, эти методы намного удобнее и гораздо менее подвержены ошибкам, -чем вычисление частей даты, потому что у вас есть весь диапазон date
параметров формата, доступных вам -без математики. Они хорошо работают для интервалов до 24 часов и, кроме точности до -секунды, должны работать и в Bash v4.2+.
Пример:
Предположим, вы также хотите добавить наносекунды:
$ start=$SECONDS
$ #wait or run process
$ date -ud "@$((SECONDS-start))" "+Elapsed Time: %H:%M:%S.%N"
Elapsed Time: 00:00:12.003247901
$ #Or, preferably
$ TZ=UTC0 printf "Elapsed Time: %(%H:%M:%S.%N)T\n" $((SECONDS-start))
Elapsed Time: 00:00:12.005056068
Бонус
Вы можете абстрагировать свое измерение времени с помощью псевдонимов, чтобы упростить задачу. Например, мы можем эмулировать команду Oracle TIMING следующим образом:
alias timingstart='start=$SECONDS'
alias timingstop='TZ=UTC0 printf "Elapsed Time: %(%T)T\n" $((SECONDS-start))'
Итак, теперь:
$ timingstart
$ sleep 2
$ timingstop
Elapsed Time: 00:00:02
[1] Информацию о переменной $SECONDS
см. в man ksh | less +/SECONDS
. [2] Информацию о форматах времени printf
см. в man ksh | less +/date-format -j.9
.