Как работать с датами и временем, если нельзя использовать date, awk, python, jq и т.п. - только встроенные средства? Такое бывает в ограниченных окружениях (initrd, контейнеры, busybox). Что остается? Только POSIX-переменные, арифметика и системный вызов времени через /proc.
▪️ Получение текущего времени в секундах (POSIX timestamp)
now=$(</proc/uptime) # uptime в секундах с долей
timestamp=$(cut -d. -f1 <<< "$now") # отбрасываем дробную часть
echo "Uptime (сек): $timestamp"
Но если доступен Bash ≥ 4.2, можно так:
now=$(printf '%(%s)T\n' -1) # текущий timestamp
▪️ Расчет интервала (например, сколько секунд назад)
start=1721133000
now=$(printf '%(%s)T\n' -1)
delta=$((now - start))
echo "Прошло $delta секунд"
▪️ Преобразование секунд в формат ЧЧ:ММ:СС
secs=9384 # Пример: 2 ч, 36 мин, 24 сек
printf -v hh '%02d' $((secs / 3600))
printf -v mm '%02d' $(((secs % 3600) / 60))
printf -v ss '%02d' $((secs % 60))
echo "$hh:$mm:$ss"
▪️ Проверка "дата в будущем/прошлом"
deadline=1721190000
now=$(printf '%(%s)T\n' -1)
if (( now > deadline )); then
echo "Просрочено"
else
echo "Еще в сроке"
fi
▪️ Простая "через N секунд"
wait_for=$((60 * 5)) # 5 минут
start=$(printf '%(%s)T\n' -1)
while true; do
now=$(printf '%(%s)T\n' -1)
(( now - start >= wait_for )) && break
sleep 1
done
echo "Прошло 5 минут"
▪️ Мини-фреймворк времени без date. Если date нет вообще, можно использовать /proc/uptime как источник времени с начала загрузки. Это полезно в init-сценариях и embedded-системах.
get_now() {
cut -d. -f1 /proc/uptime
}
Даже без date, python и awk можно: считать интервалы, вычислять прошедшее время, форматировать в ЧЧ:ММ:СС, сравнивать сроки и "таймерить". Это помогает писать portable-скрипты под ограниченные окружения.
BashTex 📱 #bash