bash倒计时(up?)计时器带警报:改进?

时间:2016-10-17 21:27:29

标签: bash timer terminal beep

MIN=1 && for i in $(seq $(($MIN*5)) -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; sleep 5; done

我最近决定尝试pomodoro工作/学习技术,因为我经常使用计算机,所以希望能够将倒计时/计时器与计算机上运行的警报拼凑在一起我正在工作。简而言之,我想以25分钟或5分钟的间隔,按分钟倒计时,然后发出警报声 - 一声响起直到重置的警报。顺便说一句,我希望这是一个非gui解决方案,我可以从终端运行

在网上搜索时,我想出了一些有效的内容(主要来自http://www.commandlinefu.com/commands/view/5886/countdown-clock) - 见上文。它倒计时并按分钟显示剩余时间,当指定的间隔结束时,它每隔5秒播放一个独特但相当非侵入性的系统铃声模式(使用“哔”程序),直到 ctrl +在运行脚本的终端中输入 c

正如我所说,我把它放在一起似乎足以满足我的需要。但是由于我对bash的理解非常有限 - 因为通过查看脚本,任何具有bash脚本经验的人都应该明白 - 我想我会问这个脚本可能会有哪些改进?是否可以进一步压缩,和/或使用不同的实用程序来实现相同目的,但是更优雅?输入将不胜感激。

后期编辑:Zoltan建议用MIN=1 && for i in $(seq $(($MIN*5)) -1 1);取代for i in $(seq 5 -1 1);,在我看来,这有点简化和改进我发布的脚本。因此,作为单行的更合理的版本将是for i in $(seq 5 -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; printf " # "; sleep 5; done。他发布的版本似乎是一个功能更强大,更灵活的脚本,因此我将其标记为最佳答案。尽管有一个像这样的选项是好的,但我想我会继续坚持我创建的版本(包括Zoltan提出的轻微改进和我想到的每次哔哔声时添加一个哈希符号[给我一个想法,如果我应该离开计算机,它已经哔哔多久[ - printf " # "部分)将时间间隔硬编码到脚本中。感谢您的投入。

2 个答案:

答案 0 :(得分:1)

我认为你的剧本很公平。

我并没有真正看到&&&在

MIN=1 && for

这意味着,如果第一个词成功,则只执行第二个词。我甚至不确定,任务的逻辑价值是什么,但是可以安全地假设,它是成功的。所以

MIN=1; for ...

应该足够了。

对于这个2-liner,整个MIN = 1似乎没有意义,你可以写

for i in $(seq 5 -1 1); do ...

另一方面,您可能希望能够更改分配的时间,这可以通过以下方式实现:

1)创建一个像beeper.sh

这样的文件

2)让你的用户可以执行

chmod u+x beeper.sh

或所有用户:

chmod a+x beeper.sh

3)在文件中编写脚本,稍加调整:

#!/bin/bash

# default timeout
timeout_mins=5
# while testing your script, making changes, you want this to be something like 1 or 2
sec_per_min=60

# check for command line input
if [ 0 -ne $# ]
then
    # assign the first command line param, no check, if it is a number, though!
    timeout_mins=$1
fi

# now it does make sense, to have a variable in the for loop core
for i in $(seq $timeout_mins -1 1)
do
    echo -n "$i, "
    sleep $sec_per_min
done

while :
do
    beep -r 25 -l 3
    sleep 5
done

4)像这样执行你的脚本(来自脚本文件所在的目录):

# using the default time
./beeper.sh

# using 9min
./beeper.sh 9

# invalid input: the seq will fail -> the for will fail -> execute the beep
./beeper.sh bla

答案 1 :(得分:0)

你可以在你内部进行无限循环,只需要打电话,我想你不需要那个循环你可以睡一段时间然后再回到那个状态并在子shell上运行

#infinite loop with beep man beep to understand better -r and -l switch
time=$((60*5))
current=0
while :
do
 #echo "Current time is: "
 #date  | egrep -o [0-9]+:[0-9]+:[0-9]+

  current=$(($current+$time / 60))
  echo "time of execution : $current min";
  beep -r 25 -l 10
  sleep $time
done

我不确定我是否理解你的问题,但解决方案仅依赖于你,如果你想要一个每分钟计数的计时器,那么解决方案就不比你发布的那个更容易了。