web-dev-qa-db-ja.com

端末にカウントダウンまたはストップウォッチタイマーを表示する方法はありますか?

Linux端末でリアルタイムのカウントダウンタイマーを表示するにはどうすればいいですか?これを行うための既存のアプリ、あるいはもっと良いのは1つのライナーがありますか?

139
tir38

なぜbeepが必要なのかよくわかりません。必要なのがストップウォッチだけであれば、これを実行できます。

while true; do echo -ne "`date`\r"; done

それはあなたにリアルタイムで経過する秒を示します、そしてあなたはそれを止めることができます Ctrl+C。もっと精度が必要な場合は、これを使用してナノ秒にすることができます。

while true; do echo -ne "`date +%H:%M:%S:%N`\r"; done

最後に、あなたが本当に、本当にすべてが0から始まり成長し始める "ストップウォッチフォーマット"が欲しいなら、あなたはこのようなことをすることができます:

date1=`date +%s`; while true; do 
   echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done

カウントダウンタイマー(これはあなたの最初の質問が求めていたものではありません)の場合、これを行うことができます(それに応じて秒数を変更します)。

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

Bash(または好きなShell)関数を使ってこれらを単純なコマンドにまとめることができます。 bashで、これらの行をあなたの~/.bashrcに追加してください(sleep 0.1はあなたがあなたのCPUをスパムしないように各実行の間にシステムを1/10秒待つでしょう):

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
}

次のコマンドを実行して、1分のカウントダウンタイマーを開始できます。

countdown 60

あなたは2時間カウントダウンすることができます:

countdown $((2*60*60))

または一日中:

countdown $((24*60*60))

次のコマンドを実行してストップウォッチを起動します。

stopwatch

あなたが日、時間、分、秒を扱うことができる必要があるならば、あなたはこのような何かをすることができました:

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
}

stopwatch関数は、24時間待つ必要がなかったため、何日もテストされていません。うまくいくはずですが、うまくいかない場合はお知らせください。

176
terdon

私の好きな方法は:

開始:

time cat

やめる:

ctrl+c

@wjandreaが以下にコメントしたように、別のバージョンが実行される予定です。

time read

そしてEnterを押して停止します

88
alfasin

私は同じことを探していて、Pythonでもっと手の込んだものを書いてしまいました。

これはあなたに簡単な10秒のカウントダウンをするでしょう:

Sudo pip install termdown
termdown 10

出典: https://github.com/trehn/termdown

36
trehn
sh-3.2# man leave

15分にタイマーを設定する

sh-3.2# leave +0015
Alarm set for Thu Nov  3 14:19:31 CDT 2016. (pid 94317)
sh-3.2#

edit:たくさんのリンクを開いていましたが、これはosx特有のものだと思いました、ごめんなさい。他の人がBSDへの休暇を知っているように私の答えを上げておく。

13
efk

私はこれを使った:

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
)

例:

 countdown "00:07:55"

これが ソースです

13
Adobe

これは、100分の1秒のストップウォッチ用です。

#!/usr/bin/awk -f
function z() {
  getline < "/proc/uptime"
  close("/proc/uptime")
  return $0
}
BEGIN {
  x = z()
  while (1) {
    y = z()
    printf "%02d:%05.2f\r", (y - x) / 60, (y - x) % 60
  }
}

6
Steven Penny

私は非常に良いterdonの答えを、開始からの時間と終了までの時間を同時に表示する関数に組み合わせました。 3つのバリエーションもありますので、呼び出しが簡単で(bash数学を行う必要はありません)、また抽象化されています。 使用例

{ ~ }  » time_minutes 15
Counting to 15 minutes
Start at 11:55:34     Will finish at 12:10:34
     Since start: 00:00:08     Till end:  00:14:51

そして仕事のタイマーのようなもの:

{ ~ }  » time_hours 8
Counting to 8 hours
Start at 11:59:35   Will finish at 19:59:35
     Since start: 00:32:41     Till end:  07:27:19

そして、非常に具体的な時間が必要な場合は、

{ ~ }  » time_flexible 3:23:00
Counting to 3:23:00 hours
Start at 12:35:11   Will finish at 15:58:11
     Since start: 00:00:14     Till end:  03:22:46

ここにコードがある あなたの.bashrcに入れる

function time_func()
{
   date2=$((`date +%s` + $1));
   date1=`date +%s`;
   date_finish="$(date --date @$(($date2)) +%T )"

   echo "Start at `date +%T`   Will finish at $date_finish"

    while [ "$date2" -ne `date +%s` ]; do
     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";
     sleep 1
    done

    printf "\nTimer finished!\n"
    play_sound ~/finished.wav
}

function time_seconds()
{
  echo "Counting to $1 seconds"
  time_func $1
}

function time_minutes()
{
  echo "Counting to $1 minutes"
  time_func $1*60
}

function time_hours()
{
  echo "Counting to $1 hours"
  time_func $1*60*60
}

function time_flexible()  # accepts flexible input hh:mm:ss
{
    echo "Counting to $1"
    secs=$(time2seconds $1)
    time_func $secs
}

function play_sound()  # adjust to your system
{
    cat $1 > /dev/dsp
}

function time2seconds() # changes hh:mm:ss to seconds, found on some other stack answer
{ 
    a=( ${1//:/ }) 
    echo $((${a[0]}*3600+${a[1]}*60+${a[2]})) 
}

これを何らかの方法で サウンドを再生する / linuxターミナルで( mp3またはwavファイルをLinuxのコマンドラインで再生する )またはcygwin(cat /path/foo.wav > /dev/dspで動作する)私はbabun/win7にいます)そしてあなたは アラーム付きのシンプルで柔軟なタイマーを持っています

4
Koshmaar

他のアプローチ

countdown=60 now=$(date +%s) watch -tpn1 echo '$((now-$(date +%s)+countdown))'

Mac用:

countdown=60 now=$(date +%s) watch -tn1 echo '$((now-$(date +%s)+countdown))'
#no p option on mac for watch

シグナルがゼロになったときにシグナルが必要な場合は、次のようにします。ゼロでない終了ステータスを返すコマンドでそれを構築し、それをwatch -b、または何かと組み合わせることができますが、もっと複雑なスクリプトを構築したい場合は、これはおそらく不可能な方法です。それは「迅速で汚いワンライナー」タイプのソリューションです。


私は一般的にwatchプログラムが好きです。無数のwhile sleep 5; doループをさまざまなエフェクトに既に書いた後、私は最初にそれを見ました。 watchは明らかに優れていました。

4

私は自分のシェルスクリプトを書いてしまいました: github Gist

#!/bin/sh
# script to create timer in terminal
# Jason Atwood
# 2013/6/22

# start up
echo "starting timer script ..."
sleep 1 # seconds

# get input from user
read -p "Timer for how many minutes?" -e DURATION
DURATION=$(( $DURATION*60 )) # convert minutes to seconds

# get start time
START=$(date +%s)

# infinite loop
while [ -1 ]; do
clear # clear window

# do math
NOW=$(date +%s) # get time now in seconds
DIF=$(( $NOW-$START ))  # compute diff in seconds
ELAPSE=$(( $DURATION-$DIF ))    # compute elapsed time in seconds
MINS=$(( $ELAPSE/60 ))  # convert to minutes... (dumps remainder from division)
SECS=$(( $ELAPSE - ($MINS*60) )) # ... and seconds

# conditional
if [ $MINS == 0 ] && [ $SECS == 0 ] # if mins = 0 and secs = 0 (i.e. if time expired)
then # blink screen
for i in `seq 1 180`; # for i = 1:180 (i.e. 180 seconds)
do
clear # flash on
setterm -term linux -back red -fore white # use setterm to change background color
echo "00:00 " # extra tabs for visibiltiy

sleep 0.5

clear # flash off
setterm -term linux -default # clear setterm changes from above
echo "00:00" # (i.e. go back to white text on black background)
sleep 0.5
done # end for loop
break   # end script

else # else, time is not expired
echo "$MINS:$SECS"  # display time
sleep 1 # sleep 1 second
fi  # end if
done    # end while loop 
3
tir38

自分のスクリプトでsleepenhツールを使用した人が誰もいないのは驚きです。代わりに、提案された解決策は、後続のタイマ出力の間にsleep 1を使用するか、またはできるだけ速く出力するビジーループを使用します。前者は、印刷に費やす時間が少ないため、実際には1秒に1回出力されるのではなく、最適とは言えない出力よりも少し少なくなるため、不適切です。十分な時間が経過した後、カウンターは1秒スキップします。正当な理由がないのにCPUをビジー状態にしているため、後者は不適切です。

私の$PATHにあるツールは、こんな感じです。

#!/bin/sh
if [ $# -eq 0 ]; then
    TIMESTAMP=$(sleepenh 0)
    before=$(date +%s)
    while true; do
        diff=$(($(date +%s) - before))
        printf "%02d:%02d:%02d\r" $((diff/3600)) $(((diff%3600)/60)) $((diff%60))
        TIMESTAMP=$(sleepenh $TIMESTAMP 1.0);
    done
    exit 1 # this should never be reached
fi
echo "counting up to $@"
"$0" &
counterpid=$!
trap "exit" INT TERM
trap "kill 0" EXIT
sleep "$@"
kill $counterpid

このスクリプトは、ストップウォッチ(中断されるまでカウントアップ)としても、指定された時間実行されるタイマーとしても使用できます。 sleepコマンドが使用されるので、このスクリプトはあなたのsleepが許すのと同じ精度で数える期間を指定することを可能にします。 Debianとその派生物では、これには1秒未満の睡眠と時間を指定するための人間が読むことのできる素敵な方法が含まれています。だから例えばあなたは言うことができます:

$ time countdown 2m 4.6s
countdown 2m 4.6s  0.00s user 0.00s system 0% cpu 2:04.60 total

そしてご覧のとおり、スクリプト自体にはあまり魔法をかけずに、コマンドは2分4.6秒の間正確に実行されました。

編集

Sleepenhツールは、DebianとUbuntuのような派生物の同名のパッケージから来ています。持っていないディストリビューションの場合は、 https://github.com/nsc-deb/sleepenh から取得されます。

Sleepenhの利点は、ループ中のスリープ以外のものの処理から時間の経過とともに累積する小さな遅延を考慮に入れることができるということです。ループ内でsleep 1を10回実行しただけでも、sleepを実行してループを繰り返すことによるオーバーヘッドが小さいため、全体の実行には10秒以上かかります。このエラーは徐々に累積し、時間が経つにつれてストップウォッチタイマーがますます不正確になるでしょう。この問題を解決するには、ループの繰り返しごとに正確なスリープ時間を計算する必要があります。これは通常1秒よりわずかに短い時間です(1秒間隔のタイマーの場合)。 sleepenhツールはあなたのためにこれを行います。

3
josch

Pythonの例:

#!/usr/bin/python

def stopwatch ( atom = .01 ):
    import time, sys, math

    start = time.time()
    last = start
    sleep = atom/2
    fmt = "\r%%.%sfs" % (int(abs(round(math.log(atom,10))))  if atom<1 else "")
    while True:
        curr = time.time()
        subatom = (curr-last)
        if subatom>atom:
            # sys.stdout.write( "\r%.2fs" % (curr-start))
            sys.stdout.write( fmt % (curr-start))
            sys.stdout.flush()
            last = curr
        else:
            time.sleep(atom-subatom)

stopwatch()

demo

1
user84207

今後の参考のために、カウントダウン/カウントアップタイマー用の非常に簡単なコマンドラインオプションを持つ µTimer というコマンドラインツールがあります。

1
Tom

sw は永遠に続く単純なストップウォッチです。

sw

インストール

wget -q -O - http://git.io/sinister | sh -s -- -u https://raw.githubusercontent.com/coryfklein/sw/master/sw

使用法

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
1
Cory Klein

あなたはOSXのコマンドラインストップウォッチを探している人のふりをします。あなたはGNUツールをインストールしたくないし、単にunix dateを使って実行したいと思っているのではないかと思います。

その場合は@terdonが言っているようにしてくださいが、この修正を加えます。

function stopwatch(){
    date1=`date +%s`; 
    while true; do 
        echo -ne "$(date -jf "%s" $((`date +%s` - $date1)) +%H:%M:%S)\r"; 
        sleep 0.1
    done
}
1
joem

単にUTC時間でwatch + dateを使用してください。大きなディスプレイ用のパッケージをインストールすることもできます。

export now="`date +%s -u`";
watch -n 0,1 'date +%T -u -d @$((`date +%s` - $now ))'

#Big plain characters
watch -n 0,1 'date +%T -u -d @$((`date +%s` - $now )) | toilet -f mono12'

#Big empty charaters
watch -n 0,1 'date +%T -u -d @$((`date +%s` - $now )) | figlet -c -f big'

それを試してみてください!

http://www.cyberciti.biz/faq/create-large-colorful-text-banner-on-screen/ もご覧ください。

1
MUY Belgium

短い答え:

for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done

説明:

私は多くの答えがあることを知っていますが、私はOPの質問に非常に近い何かを投稿したいだけです。それは個人的には「oneliner countdown in terminal」として受け入れます。私の目標は次のとおりです。

  1. 一つのライナー.
  2. カウントダウン.
  3. 覚えやすくコンソールに入力する(機能や重いロジックはなく、bashのみ)。
  4. 追加のソフトウェアをインストールする必要はありません(rootを持っていなくても、ssh経由でアクセスできるどのサーバーでも使用できます)。

使い方:

  1. seqは60から1までの数を表示します。
  2. echo -ne "\r$i "は、文字列の先頭にキャレットを返し、現在の$i値を出力します。現在の$i(10 - > 9)よりも文字数だけ長い場合は、前の値を上書きする必要がある後のスペース。
0
cronfy

TermTime をご覧ください。これは端末ベースの時計とストップウォッチです。

pip install termtime

0
vimist

これは一般に認められている回答と似ていますが、terdonのcountdown()によって構文エラーが発生します。これは私にとってはうまくいきますが:

function timer() { case "$1" in -s) shift;; *) set $(($1 * 60));; esac; local S=" "; for i in $(seq "$1" -1 1); do echo -ne "$S\r $i\r"; sleep 1; done; echo -e "$S\rTime's up!"; }

それを.bashrcに入れてから:timer tで実行することができます(tは分単位の時間です)。

0
Andy Forceno

ストップウォッチのGUI版

date1=`date +%s`
date1_f=`date +%H:%M:%S____%d/%m`
(
  while true; do 
    date2=$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)
    echo "# started at $date1_f \n$date2"
  done
) |
zenity --progress \
  --title="Stop Watch" \
  --text="Stop Watch..." \
  --percentage=0
0
Mohamed Samy

ワークショップのための大きなカウントダウンタイマーを表示するための用語アプリケーションを探すとき、今日より早くこの質問を見つけました。提案のどれも私がまさに必要としていたものではなかったので、私はすぐにGoで別のものをまとめました: https://github.com/bnaucler/cdown

質問はすでに十分に答えられているので、これは後世のためであると考えてください。

0
B Nauclér

$ sleep 1500 && xterm -fg yellow -g 240x80&

黄色いテキストのあの大きな端末が飛び上がったら、起き上がってストレッチする時が来ました!

注: - 1500秒= 25分pomodoro - 240 x 80 = 240文字の行、および80行の端末サイズ。目立つように私のために画面を埋めます。

クレジット: http://www.linuxquestions.org/questions/linux-newbie-8/countdown-timer-for-linux-949463/

0
user79878