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

时间:2018-01-19 05:50:44

标签: bash time sleep

我曾经写过kitchen timer for the terminal一段时间(不幸的是,macOS现在只是)。它运行一段特定的时间,然后退出并发出响铃声:

timer demo gif

这是通过循环某些逻辑 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脚本更好吗?

1 个答案:

答案 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

长期来看大部分都是准确的,但显示的时钟偶尔会跳过一秒钟以吸收累积的时差。我不确定这种现象是否可以接受。