bash 倒计时(向上?)计时器 w/alarm:改进?
bash countdown(up?) timer w/alarm: improvements?
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 work/learning 技术,并且由于我通常使用计算机工作,因此希望能够拼凑出一个 countdown/up 带闹钟的计时器运行s 在我工作的机器上。简而言之,我想按分钟计算 down/up 25 分钟或 5 分钟的间隔,然后发出警报声——警报声一直响到重置。顺便说一句,我希望这是一个非图形用户界面的解决方案,我可以从终端运行
在网上搜索后,我想出了一些可行的方法(主要取自 http://www.commandlinefu.com/commands/view/5886/countdown-clock )——见上文。它倒计时并按分钟显示剩余时间,当指定的间隔结束时,它会每 5 秒播放一次独特但相当非侵入性的系统铃声模式(使用 "beep" 程序),直到 ctrl+c 在脚本来自的终端中输入 运行.
就像我说的,我放在一起的东西似乎很适合我的需要。但是由于我对 bash 的理解非常有限——因为通过查看脚本,任何具有 bash 脚本编写经验的人都应该明白这一点——我想我会在这里问一下可能会有哪些改进被制作成这个剧本?是否可以进一步压缩,and/or 也许使用不同的实用程序来实现相同的目的,但以更优雅的方式?将不胜感激。
后期编辑:在我看来,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 " # "
部分)将时间间隔硬编码到脚本中。感谢您的输入。
你可以在里面做无限循环你只会调用 beep 我认为你不需要循环你可以睡一段时间 beep 然后回到那个状态 运行 它在 subshell
#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
我不确定我是否理解你的问题,但解决方案只取决于你,如果你想要一个每分钟计数的计时器,那么解决方案不会比你在上面发布的那个更容易。
我觉得你的剧本很公平
我真的不明白
中 && 的意义
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=
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
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 work/learning 技术,并且由于我通常使用计算机工作,因此希望能够拼凑出一个 countdown/up 带闹钟的计时器运行s 在我工作的机器上。简而言之,我想按分钟计算 down/up 25 分钟或 5 分钟的间隔,然后发出警报声——警报声一直响到重置。顺便说一句,我希望这是一个非图形用户界面的解决方案,我可以从终端运行
在网上搜索后,我想出了一些可行的方法(主要取自 http://www.commandlinefu.com/commands/view/5886/countdown-clock )——见上文。它倒计时并按分钟显示剩余时间,当指定的间隔结束时,它会每 5 秒播放一次独特但相当非侵入性的系统铃声模式(使用 "beep" 程序),直到 ctrl+c 在脚本来自的终端中输入 运行.
就像我说的,我放在一起的东西似乎很适合我的需要。但是由于我对 bash 的理解非常有限——因为通过查看脚本,任何具有 bash 脚本编写经验的人都应该明白这一点——我想我会在这里问一下可能会有哪些改进被制作成这个剧本?是否可以进一步压缩,and/or 也许使用不同的实用程序来实现相同的目的,但以更优雅的方式?将不胜感激。
后期编辑:在我看来,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 " # "
部分)将时间间隔硬编码到脚本中。感谢您的输入。
你可以在里面做无限循环你只会调用 beep 我认为你不需要循环你可以睡一段时间 beep 然后回到那个状态 运行 它在 subshell
#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
我不确定我是否理解你的问题,但解决方案只取决于你,如果你想要一个每分钟计数的计时器,那么解决方案不会比你在上面发布的那个更容易。
我觉得你的剧本很公平
我真的不明白
中 && 的意义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=
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