2013-06-24 20:13:51 +0000 2013-06-24 20:13:51 +0000
157
157

ターミナルにカウントダウンやストップウォッチのタイマーを表示する方法はありますか?

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

回答 (22)

195
195
195
2013-06-24 22:11:13 +0000

なんで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(またはお好みのシェル)関数を使用して簡単なコマンドにまとめることができます。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))

を使用して2時間、または1日をカウントダウンすることができます。

countdown $((24*60*60))

を実行してストップウォッチをスタートさせることができます。

stopwatch

_注意:stopwatch関数は24時間待ちたくなかったので、何日もテストしていません。動作するはずですが、動作しなかったら教えてください。

100
100
100
2015-03-30 08:26:08 +0000

私のお気に入りの方法は以下の通りです:

スタート。

time cat

Stop:

ctrl+c

下記の@wjandreaのコメントにあるように、別のバージョンを実行します。

time read

を実行し、Enter を押すと停止します。

46
46
46
2014-06-06 07:06:57 +0000

同じものを探していたのですが、結局Pythonでもっと凝ったものを書いてしまいました。

これは簡単な10秒カウントダウンをしてくれます。

sudo pip install termdown
termdown 10

ソース。 https://github.com/trehn/termdown

14
14
14
2016-11-03 19:06:37 +0000
sh-3.2# man leave

set a timer for 15 minutes

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

edit: 私はたくさんのリンクを開いていて、これはOSXに特有のものだと思っていました。他の人がBSD上でのleaveを認識しているように、私の答えを残しておきます。

13
13
13
2013-06-26 19:52:03 +0000

これを使ってみました。

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"

ここにソースがあります。

6
6
6
2013-12-29 05:42:56 +0000

これは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
  }
}

5
5
5
2019-06-05 10:48:15 +0000

短答です。

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. 追加のソフトウェアをインストールする必要がない(ssh 経由で行くサーバであれば、root を持っていなくても使用可能)。

動作方法。

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

4
4
4
2015-02-01 14:42:54 +0000

私は非常に良い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 に入れるコードです。 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ターミナル Linuxコマンドラインでmp3やwavファイルを再生) やcygwin (私はbabun/win7でcat /path/foo.wav > /dev/dspが動作します) でサウンドを再生する方法を組み合わせれば、アラーム付きのシンプルで柔軟なタイマー**が完成します!

3
3
3
2013-06-25 00:40:38 +0000

結局、自分でシェルスクリプトを書くことになった。 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
3
3
2016-11-24 15:38:57 +0000

誰もスクリプトで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 やその派生製品では、これには秒単位のスリープや、人間が読みやすいように時間を指定する方法が含まれています。例えば、以下のようになります。

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

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

EDIT .

sleepenhツールはDebianやUbuntuなどの派生ディストリビューションにある同名のパッケージから来ています。それを持っていないディストリビューションでは、 https://github.com/nsc-deb/sleepenh

sleepenhの利点は、ループ中のスリープ以外の処理によって時間の経過とともに蓄積される小さな遅延を考慮に入れることができることです。ループ内でsleep 1を10回実行したとしても、sleepを実行してループを繰り返すことから生じる小さなオーバーヘッドのため、全体の実行には10秒以上かかることになります。このエラーはゆっくりと蓄積されていき、時間が経つにつれてストップウォッチタイマーはますます不正確になっていきます。この問題を解決するためには、ループを繰り返すたびに、通常は1秒未満の正確なスリープ時間を計算しなければなりません(1秒間隔のタイマーの場合)。sleepenhツールがこれをやってくれます。

3
3
3
2014-08-21 19:13:05 +0000

別のアプローチ

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

Mac用。


私は一般的にwatch -bのプログラムが好きです。私がこれを初めて見たのは、すでに様々な効果を持つ無数のwatchループを書いた後でした。while sleep 5; doの方が明らかに良かった。

3
3
3
2017-06-23 21:06:54 +0000

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
1
1
2015-04-13 12:34:57 +0000

あなたがOSX上でコマンドラインストップウォッチを探している人だとしましょう。gnu ツールをインストールせずに unix date

で実行したいと仮定してみてください。

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
1
1
2019-04-13 14:58:34 +0000

TermTime ](https://github.com/vimist/termtime)を見てみましょう。

pip install termtime

1
1
1
2015-06-02 01:12:11 +0000

時計と日付をUTC時間で表示するだけです。大きな表示をするためのパッケージをインストールすることもできます。

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'

試してみてください。

0x1&

試してみてください。

1
1
1
2014-09-26 15:21:48 +0000

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

1
1
1
2014-02-13 12:00:38 +0000

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()

0
0
0
2018-11-05 13:49:26 +0000

ストップウォッチ

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
```のGUI版
0
0
0
2016-12-08 20:20:14 +0000

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

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

0
0
0
2017-01-24 23:04:07 +0000

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

黄色い文字の大きな端末が飛び上がったら、立ち上がってストレッチしましょう!

注意点。- 1500秒=25分ポモドーロ - 240x80=240文字行、80行の端末サイズ。私にとっては目に見えて画面がいっぱいになる。

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

0
0
0
2016-04-20 15:14:05 +0000

これは受け入れられた答えと似ていますが、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で実行することができます。0x6& (ここで t は分単位の時間)。

-2
-2
-2
2014-08-18 17:19:37 +0000

何らかの理由でコンパイル可能なプログラムが必要な場合は、以下のようにすると良いでしょう。

#include <iostream>
#include <string>
#include <chrono>

int timer(seconds count) {
  auto t1 = high_resolution_clock::now();
  auto t2 = t1+count;
  while ( t2 > high_resolution_clock::now()) {
    std::cout << "Seconds Left:" <<
    std::endl <<
      duration_cast<duration<double>>(count-(high_resolution_clock::now()-t1)).count() << 
    std::endl << "0x1&33[2A0x1&33[K";
    std::this_thread::sleep_for(milliseconds(100));
  }
  std::cout << "Finished" << std::endl;
  return 0;
}

これは他のプログラムにも使えますし、簡単に移植できます。

関連する質問

6
10
7
5
6