以精确的 1 秒增量输出到终端(来自 bash 脚本)

Output to terminal (from bash script) in precise, 1-second increments

我不久前写了一篇 kitchen timer for the terminal(不幸的是,目前仅限 macOS)。它 运行s 持续指定的时间段,然后退出并发出铃声:

它通过循环某些逻辑 n 次(其中 n 是指定的秒数),调整终端输出来实现和 sleeping for 1s in each loop.

我注意到它实际上比指定的时间要长一点:

$ time timer 0.05
[13:18] Time expired

real    0m3.289s
user    0m0.118s
sys     0m0.098s

$ time timer 0.1
[13:18] Time expired

real    0m6.362s
user    0m0.134s
sys     0m0.127s

$ time timer 0.2
[13:19] Time expired

real    0m12.496s
user    0m0.166s
sys     0m0.183s

看起来围绕每个 sleep 1 的所有逻辑都需要少量时间,并且在 15 分钟的时间段内,这些毫秒加起来。当我将定时器设置为以重复间隔响铃时(例如, 无限期地每十五分钟响一次),然后我可以在上午 11 点启动它,让它在 11:15 和 11:30 等,但到了一天结束时,它会在 4:07 和 4:22 或类似的地方响起。

关于如何 运行 一个计时器,一次更新一秒的输出,但忠实地测量很长的时间跨度,有什么想法吗?

对于 C 而言,这是否比 bash 脚本更好?

怎么样:

#!/bin/bash

now=$( date +%s )
remain=$((  * 60 ))    # supply minute(s) in integer as an argument
finish=$(( $now + $remain ))

while [ $remain -gt 0 ]; do
    remain=$(( $finish - $( date +%s ) ))
    mm=$(( $remain / 60 ))
    ss=$(( $remain - $mm * 60 ))
    printf "%02d:%02d" $mm $ss
    sleep 1
    echo -ne "\r"
done

# ring a bell or tell something here

从长远来看,它基本上是准确的,但显示的时钟偶尔会跳一秒以吸收累积的时差。我不确定这种现象是否可以接受。