tir*_*r38 207 linux unix command-line
如何在 Linux 终端上显示实时倒数计时器?是否有现有的应用程序,或者甚至更好的单班轮来做到这一点?
ter*_*don 242
我不确定你为什么需要beep. 如果你只想要一个秒表,你可以这样做:
while true; do echo -ne "`date`\r"; done
Run Code Online (Sandbox Code Playgroud)
这将向您显示实时经过的秒数,您可以使用Ctrl+停止它C。如果您需要更高的精度,您可以使用它来为您提供纳秒:
while true; do echo -ne "`date +%H:%M:%S:%N`\r"; done
Run Code Online (Sandbox Code Playgroud)
最后,如果你真的,真的想要“秒表格式”,一切从 0 开始并开始增长,你可以做这样的事情:
date1=`date +%s`; while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done
Run Code Online (Sandbox Code Playgroud)
对于倒数计时器(这不是您最初的问题所要求的),您可以这样做(相应地更改秒数):
seconds=20; date1=$((`date +%s` + $seconds));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s` )) +%H:%M:%S)\r";
done
Run Code Online (Sandbox Code Playgroud)
您可以使用 bash(或您喜欢的任何 shell)函数将这些组合成简单的命令。在 bash 中,将这些行添加到您的~/.bashrc(这sleep 0.1将使系统在每次运行之间等待 1/10 秒,这样您就不会向 CPU 发送垃圾邮件):
function countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";
sleep 0.1
done
}
function stopwatch(){
date1=`date +%s`;
while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过运行以下命令启动一分钟的倒数计时器:
countdown 60
Run Code Online (Sandbox Code Playgroud)
你可以倒计时两个小时:
countdown $((2*60*60))
Run Code Online (Sandbox Code Playgroud)
或一整天使用:
countdown $((24*60*60))
Run Code Online (Sandbox Code Playgroud)
并通过运行启动秒表:
stopwatch
Run Code Online (Sandbox Code Playgroud)
如果您需要能够处理天以及小时、分钟和秒,您可以执行以下操作:
countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
## Is this more than 24h away?
days=$(($(($(( $date1 - $(date +%s))) * 1 ))/86400))
echo -ne "$days day(s) and $(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";
sleep 0.1
done
}
stopwatch(){
date1=`date +%s`;
while true; do
days=$(( $(($(date +%s) - date1)) / 86400 ))
echo -ne "$days day(s) and $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
Run Code Online (Sandbox Code Playgroud)
请注意,该stopwatch功能已经好几天没有经过测试了,因为我真的不想等待 24 小时。它应该可以工作,但如果不行,请告诉我。
Nir*_*asi 119
我最喜欢的方式是:
开始:
time cat
Run Code Online (Sandbox Code Playgroud)
停止:
ctrl+c
Run Code Online (Sandbox Code Playgroud)
正如@wjandrea 在下面评论的,另一个版本是运行:
time read
Run Code Online (Sandbox Code Playgroud)
并按下Enter停止
tre*_*ehn 61
我一直在寻找同样的东西,最终用 Python 写了一些更复杂的东西:
这将为您提供一个简单的 10 秒倒计时:
sudo pip install termdown
termdown 10
Run Code Online (Sandbox Code Playgroud)
来源:https : //github.com/trehn/termdown
小智 23
使用leave(它至少适用于BSD后代):
man leave
Run Code Online (Sandbox Code Playgroud)
设置一个 15 分钟的计时器:
leave +0015
Alarm set for Thu Nov 3 14:19:31 CDT 2016. (pid 94317)
Run Code Online (Sandbox Code Playgroud)
Ado*_*obe 13
我用过这个:
countdown()
(
IFS=:
set -- $*
secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} ))
while [ $secs -gt 0 ]
do
sleep 1 &
printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))
secs=$(( $secs - 1 ))
wait
done
echo
)
Run Code Online (Sandbox Code Playgroud)
例子:
countdown "00:07:55"
Run Code Online (Sandbox Code Playgroud)
这是一个来源。
简短的回答:
for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done
Run Code Online (Sandbox Code Playgroud)
解释:
我知道有很多答案,但我只想发布一些非常接近 OP 问题的内容,我个人认为确实是“终端中的 oneliner 倒计时”。我的目标是:
这个怎么运作:
seq 打印从 60 到 1 的数字。echo -ne "\r$i "将插入符号返回到字符串的开头并打印当前$i值。如果它比当前值$i(10 -> 9)长字符,则需要覆盖前一个值后的空格。我使用这个小的 Go 程序:
package main
import (
"fmt"
"time"
)
func format(d time.Duration) string {
mil := d.Milliseconds() % 1000
sec := int(d.Seconds()) % 60
min := int(d.Minutes())
return fmt.Sprintf("%v m %02v s %03v ms", min, sec, mil)
}
func main() {
t := time.Now()
for {
time.Sleep(10 * time.Millisecond)
s := format(time.Since(t))
fmt.Print("\r", s)
}
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/89z/sienna/tree/master/cmd/stopwatch
sw是一个可以永远运行的简单秒表。

wget -q -O - http://git.io/sinister | sh -s -- -u https://raw.githubusercontent.com/coryfklein/sw/master/sw
Run Code Online (Sandbox Code Playgroud)
sw
- start a stopwatch from 0, save start time in ~/.sw
sw [-r|--resume]
- start a stopwatch from the last saved start time (or current time if no last saved start time exists)
- "-r" stands for --resume
Run Code Online (Sandbox Code Playgroud)
另一种方法
countdown=60 now=$(date +%s) watch -tpn1 echo '$((now-$(date +%s)+countdown))'
Run Code Online (Sandbox Code Playgroud)
对于 Mac:
countdown=60 now=$(date +%s) watch -tn1 echo '$((now-$(date +%s)+countdown))'
#no p option on mac for watch
Run Code Online (Sandbox Code Playgroud)
如果一个人想要一个当它达到零时的信号,例如可以用一个命令来构建它,该命令在零时返回一个非零退出状态并将其与watch -b, 或其他东西结合起来,但如果一个人想要构建一个更复杂的脚本,这可能是不是要走的路;它更像是一种“快速而肮脏的单线”类型的解决方案。
我喜欢这个watch程序。我第一次看到它是在我已经编写了无数个while sleep 5; do不同效果的循环之后。watch显然更好。
小智 5
我将terdon 的非常好的答案合并到一个函数中,该函数同时显示自开始以来的时间和到结束的时间。还有三种变体,因此更容易调用(您不必进行 Bash 数学),而且它也是抽象的。
\n\n使用示例:
\n\n{ ~ } \xc2\xbb time_minutes 15\nCounting to 15 minutes\nStart at 11:55:34 Will finish at 12:10:34\n Since start: 00:00:08 Till end: 00:14:51\nRun Code Online (Sandbox Code Playgroud)\n\n还有像工作计时器之类的东西:
\n\n{ ~ } \xc2\xbb time_hours 8\nCounting to 8 hours\nStart at 11:59:35 Will finish at 19:59:35\n Since start: 00:32:41 Till end: 07:27:19\nRun Code Online (Sandbox Code Playgroud)\n\n如果您需要一些非常具体的时间:
\n\n{ ~ } \xc2\xbb time_flexible 3:23:00\nCounting to 3:23:00 hours\nStart at 12:35:11 Will finish at 15:58:11\n Since start: 00:00:14 Till end: 03:22:46\nRun Code Online (Sandbox Code Playgroud)\n\n这是放入 .bashrc 中的代码
\n\nfunction time_func()\n{\n date2=$((`date +%s` + $1));\n date1=`date +%s`;\n date_finish="$(date --date @$(($date2)) +%T )"\n\n echo "Start at `date +%T` Will finish at $date_finish"\n\n while [ "$date2" -ne `date +%s` ]; do\n echo -ne " Since start: $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S) Till end: $(date -u --date @$(($date2 - `date +%s`)) +%H:%M:%S)\\r";\n sleep 1\n done\n\n printf "\\nTimer finished!\\n"\n play_sound ~/finished.wav\n}\n\nfunction time_seconds()\n{\n echo "Counting to $1 seconds"\n time_func $1\n}\n\nfunction time_minutes()\n{\n echo "Counting to $1 minutes"\n time_func $1*60\n}\n\nfunction time_hours()\n{\n echo "Counting to $1 hours"\n time_func $1*60*60\n}\n\nfunction time_flexible() # Accepts flexible input hh:mm:ss\n{\n echo "Counting to $1"\n secs=$(time2seconds $1)\n time_func $secs\n}\n\nfunction play_sound() # Adjust to your system\n{\n cat $1 > /dev/dsp\n}\n\nfunction time2seconds() # Changes hh:mm:ss to seconds. Found in some other Stack Exchange answer\n{ \n a=( ${1//:/ }) \n echo $((${a[0]}*3600+${a[1]}*60+${a[2]})) \n}\nRun Code Online (Sandbox Code Playgroud)\n\n将其与Linux 终端(通过 Linux 命令行播放 MP3 或 WAV 文件)或Cygwin(在Babun /Windows 7中适用于我)中播放声音的某种方式相结合,您就拥有了一个带闹钟的简单灵活的计时器!cat /path/foo.wav > /dev/dsp
| 归档时间: |
|
| 查看次数: |
207872 次 |
| 最近记录: |