有没有办法在终端中显示倒计时或秒表计时器?

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 小时。它应该可以工作,但如果不行,请告诉我。

  • 阅读您的答案后,我立即将这些不错的函数添加到了我的 `.zshrc` 中。今天我第一次使用了 `countdown`,发现 CPU 使用率相当高。我添加了一个 `sleep 0.1`(我不知道是否所有系统都支持小数秒的睡眠时间),这大大改善了这一点。缺点当然是显示精度不太准确,但我可以忍受最大偏差。100 毫秒。 (10认同)
  • 刚刚找到这个答案。我发现将回车放在秒表函数中 echo 语句的开头很方便,因为这意味着杀死秒表不会覆盖当前的秒表时间: echo -ne "\r$(date -u --date @$ ((`date +%s` - $date1)) +%H:%M:%S)"; (3认同)
  • @chishaku:在 OS X 上,这似乎对我有用:`echo -ne "$(date -ju -f %s $(($date1 - `date +%s`)) +%H:%M:% S)\r"`; (3认同)
  • @chishaku是的,OSX `date`命令[没有`-d`选项](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1 .html)。嗯,确实如此,但这是为了别的事。你也许可以用“-v”做一些事情,但我没有 mac(或无法访问 BSD“find”),所以我帮不上什么忙。 (2认同)

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停止

  • `time read` 在 zsh 中失败,但 `time (read)` 有效。 (16认同)
  • 类似,但您可以按 Enter 停止它:`time read` (13认同)
  • 但问题是,如果不取消或完成它,您就无法看到时间。当您重新启动它时,计时器将重新开始。 (5认同)
  • 这么漂亮的解决方案。容易记住。 (2认同)

tre*_*ehn 61

我一直在寻找同样的东西,最终用 Python 写了一些更复杂的东西:

这将为您提供一个简单的 10 秒倒计时:

sudo pip install termdown
termdown 10
Run Code Online (Sandbox Code Playgroud)

来源:https : //github.com/trehn/termdown

  • @Suhaib:它应该并且对我有用。请在 GitHub 上提出问题并提供更多信息。 (2认同)

小智 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)

  • leave 在 mac 上完成工作并产生哔声 (4认同)
  • leave 也适用于 Linux,但首先您必须从默认存储库安装 leave 程序。 (2认同)
  • 这很好,但目前它不计算秒数,因此无法倒计时 30 秒,例如 (2认同)

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)

这是一个来源

  • 符合 POSIX - 适用于 OS X :) (3认同)

cro*_*nfy 9

简短的回答:

for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done
Run Code Online (Sandbox Code Playgroud)

解释:

我知道有很多答案,但我只想发布一些非常接近 OP 问题的内容,我个人认为确实是“终端中的 oneliner 倒计时”。我的目标是:

  1. 一个班轮。
  2. 倒数。
  3. 易于记忆和输入控制台(没有功能和繁重的逻辑,只有 bash)。
  4. 不需要安装额外的软件(可以在我通过 ssh 访问的任何服务器上使用,即使我没有 root)。

这个怎么运作:

  1. seq 打印从 60 到 1 的数字。
  2. echo -ne "\r$i "将插入符号返回到字符串的开头并打印当前$i值。如果它比当前值$i(10 -> 9)长字符,则需要覆盖前一个值后的空格。

  • 这最适合我在 Mac OS 上用于 bash 脚本的用例。对它如何工作的解释非常有帮助。 (2认同)

Ste*_*nny 7

我使用这个小的 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


Cor*_*ein 7

sw是一个可以永远运行的简单秒表。

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)


Dan*_*son 5

另一种方法

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\n
Run 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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是放入 .bashrc 中的代码

\n\n
function 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其与Linux 终端(通过 Linux 命令行播放 MP3 或 WAV 文件)或Cygwin(在Babun /Windows 7中适用于我)中播放声音的某种方式相结合,您就拥有了一个带闹钟的简单灵活的计时器cat /path/foo.wav > /dev/dsp

\n