我曾经写过kitchen timer for the terminal一段时间(不幸的是,macOS现在只是)。它运行一段特定的时间,然后退出并发出响铃声:
这是通过循环某些逻辑 n 次(其中 n 是指定的秒数),调整终端输出和SELECT b.unid1, b.unid2, b.type
FROM table1 a
INNER JOIN table2 b
ON a.unid1 = b.unid1
WHERE EXISTS
(
SELECT 1
FROM Table1 t1
INNER JOIN Table2 t2
ON t1.unid1 = t2.unid1
AND t1.unid2 = t2.unid2
WHERE t2.type in (1,2)
AND a.unid1 = t1.unid1
)
来实现的。每个循环中都有1个。
我注意到它实际上需要的时间比指定时间长一些:
sleep
看起来每个$ 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
周围的所有逻辑都需要很少的时间,并且在十五分钟的时间内,这些毫秒加起来。当我将计时器设置为以重复间隔振铃(例如无限期地每十五分钟一次)时,我可以在11a开始,让它在11:15和11:30等响,但到了最后,它会在4:07和4:22响个不停等等。
关于如何运行定时器一次一秒更新输出的任何想法,但忠实地测量很长时间?
对于C而言,这比bash脚本更好吗?
答案 0 :(得分:2)
怎么样:
#!/bin/bash
now=$( date +%s )
remain=$(( $1 * 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
长期来看大部分都是准确的,但显示的时钟偶尔会跳过一秒钟以吸收累积的时差。我不确定这种现象是否可以接受。