Точная установка временных меток в Bash с помощью printf (нетривиальная проблема)

python -m HTTPSimpleServer &  # Your Python process will now be in the background
serverpid="$!"                # Capture its PID so that you can kill it later.
watch -n /path/to/AwesomeTestCommand Arg1 Arg2
# Some time later...
kill "$serverpid"             # Make your Python process go away
3
26.09.2017, 05:47
2 ответа

тл;др

$ date +'%s%3N'
1506298414529

баш

Строгое решение bash (без внешних исполняемых файлов )невозможно, начиная с bash 4.2:

$ printf '%(%s)T\n' "-1"
1506298414

$ printf '%(%Y%m%d-%H:%M:%S)T\n' "-1"
20170924-20:13:34

Но это не позволяет ни миллисекунды, ни наносекунды (пока ).

дата

Чтобы получить миллисекунды или наносекунды, вам нужно использовать дату GNU, как это:

$ printf '%s\n' "$(date +'%Y%m%d-%H:%M:%S.%N')"
20170924-20:13:34.326113922

Или

$ printf '%s\n' "$(date +'%s.%N')"
1506298414.529678016

Ограничение до 3 цифр в дробной части секунд может быть получено с помощью формата %.3fдля printf:

$ printf '%.3f\n' "$(date +'%s.%N')"
1506298414.529

Или, что лучше, используйте возможность уменьшить количество цифр, которое допускает формат даты в наносекундах:

$ printf '%s\n' "$(date +'%s.%3N')"
1506298414.529

И тогда точку можно убрать:

$ printf '%s\n' "$(date +'%s%3N')"
1506298414529

Конечно, в данном случае более подходящим кажется более простое решение (без printf вместо того, что было задано ):

$ date +'%s%3N'
1506298414529
3
27.01.2020, 21:09

Начиная с bash5+ существует простое решение:

$ printf "%.3f\n" $EPOCHREALTIME
1566917328.786

Если точка не нужна:

printf "%s\n" "$((${EPOCHREALTIME/.}/1000))"

Укажите время в миллисекундах с начала эпохи все -в -одна -строка -из -текст, атомарный (один вызов внутренней переменной bash ), облегченный и нет проблемы с квантованием или округлением.

6
27.01.2020, 21:09

Теги

Похожие вопросы