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


144

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

回答:


184

なぜ必要なのか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により、各実行の間にシステムが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
}

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

countdown 60

次の方法で2時間カウントダウンできます。

countdown $((2*60*60))

または1日中:

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
}

stopwatch24時間待つのは本当に嫌だったので、関数は何日もテストされていないことに注意してください。動作するはずですが、動作しない場合はお知らせください。


9
.zshrcあなたの答えを読んだ後、これらの素晴らしい機能を私の権利に追加しました。今日、私countdownは初めて使用し、かなり高いCPU使用率に気付きました。sleep 0.1大幅に改善された(すべてのシステムで小数秒のスリープ時間がサポートされているかどうかわかりません)を追加しました。欠点はもちろん、表示の精度が低いことですが、最大の偏差で生きることができます。100ms。
mpy

@mpyそれについて言及してくれてありがとう。この中をやったとき、私は〜3%のCPU使用率を取得していますbash(けれども私はそれと一緒に暮らすことができ、ある私は期待して私も自分の.bashrcに睡眠を追加しているよりも高いです)。
テルドン

3
この答えを見つけました。ストップウォッチを殺しても現在のストップウォッチ時間を上書きしないことを意味するため、ストップウォッチ関数のエコーステートメントの先頭にキャリッジリターンを置くと便利です。echo -ne "\ r $(date -u --date @ $ ((date +%s-$ date1))+%H:%M:%S) ";
mkingston 14年

3
@chishaku:OS Xでは、これは私にとってはうまくいくようでした: echo -ne "$(date -ju -f %s $(($date1 - date +%s )) +%H:%M:%S)\r";
user1071847

1
ソックスパッケージ Iは、カウントダウンの終了時にプレイする素敵な音を追加します:play -q -n synth 2 pluck C5
パブロA

94

私の好きな方法は:

開始:

time cat

やめる:

ctrl+c

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

time read

を押しEnterて停止します



8
同様ですが、Enterキーを押して停止できますtime read
。– wjandrea

10
time readzshでは失敗しますが、time (read)動作します。
-Sparhawk

問題は、キャンセルするか終了しないと時間を表示できないことです。その後、再起動すると、タイマーが新たに始まります。
ゼルフィアカルツスタール

39

私は同じことを探していて、最終的にはPythonでもっと手の込んだものを書くことになりました。

これにより、単純な10秒のカウントダウンが得られます。

sudo pip install termdown
termdown 10

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


1
@DoktoroReichard:これはダウンロードリンクです。
harrymc 14

1
@Suhaib:それは私のためにすべきであり、それをします。詳細については、GitHubで問題を提起してください。
trehn 14年

1
私はそれが大好きです-これは私の路地です
ウェインワーナー

1
非常に素晴らしい、私はASCIIが好きです
ギジェルモ

1
これは本当にクールです!😄
orschiro

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
)

例:

 countdown "00:07:55"

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


2
POSIX準拠
-OS

13
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#

編集:私は開いているリンクの束を持っていた、と私はosxに固有のものだと思った、それについて申し訳ありません。回答を残して、他の人がBSDの休暇を知っているようにします。


1
leaveはLinuxでも機能しますが、最初にデフォルトのリポジトリからleaveプログラムをインストールする必要があります。
karel

6

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


素敵なLinux専用ソリューション!私は外部通話の欠如が大好きです。私のDebianシステムには/ proc / uptimeに2つの値があり、2番目の値は以前の稼働時間を指していると思われます。このスクリプトは、ライン5を変更することにより、それを改善するように調整することができるreturn $1
アダムカッツ

4

私は非常に良いテルドンの答えを、開始からの時間と終了までの時間を同時に表示する機能に組み合わせました。また、3つのバリアントがあるため、呼び出しやすく(bash mathを実行する必要はありません)、抽象化されています。使用例

{ ~ }  » 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ターミナル(Linuxコマンドライン経由でmp3またはwavファイルを再生)またはcygwin( babun / win7で動作します)でサウンド再生するいくつかの方法と組み合わせると、アラーム付きのシンプルで柔軟なタイマーができます!cat /path/foo.wav > /dev/dsp


4

別のアプローチ

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明らかに良くなった。


3

私は自分のシェルスクリプトを書くことになりました: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 

1
素敵なスクリプト、+ 1。ストップウォッチではなく、カウントダウンタイマーです。
テルドン

あなたは正しいです、それは私が本当に欲しかったことです。ネーミングを更新します。
tir38

3

誰も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ツールがこれを行います。


これが私の答えにも与える利益が分からないsleep 0.1。何がsleepnh(私はアーチレポでそれを見つけることができない)とどのように異なるんsleep?私が知る限り、あなたは基本的に上記の私の答えと同じことをしています。私は何が欠けていますか?
テルドン

@terdon Sleepenhはここから来ますgithub.com/nsc-deb/sleepenhちょうど言ってsleep 5いることの問題は、正確に5秒間眠らないことです。たとえばtime sleep 5、試してみて、コマンドの実行に5秒以上かかることがわかります。時間が経つにつれて、エラーが蓄積されます。sleepenhユーティリティを使用すると、このエラーの蓄積を簡単に回避できます。
ジョシュ

OK。私のシステムでは、0.002秒のエラーが表示されます。私は本当に誰もがツールのこの種を使用すると、ミリ秒の精度よりも良い期待することはないだろうが、それはあなたが、少なくともあなたの答えを編集し、私ならば)方がよい理由を説明するだろうsleepnhよりも優れているsleepだけ他の回答が使用言う(sleep 1そうではない-which 、OPのみがそれを使用します)およびii)標準ツールではないため、入手先とインストール方法。
テルドン

1
@terdon私は最初の段落でsleepとの違いを説明しましたsleepenh。とにかく、私はおそらくそれについて十分に明確ではなかったので、最後にそれをさらに拡張しました。ミリ秒の精度の問題は、sleep一度呼び出したときに得られるものです。それらは時間の経過とともに蓄積し、ある時点で顕著になります。他の人が使うだけだとは言いませんでしたsleep 1。私は彼らsleep 1がビジーループを使用すると言った。彼らはまだそうしています。反例を示してください。回答sleep 0.1は、sleep 1エラーをより速く蓄積することを除いて、回答と同じです。
ジョシュ

少なくともあなたが解決した問題の存在を認めている人を探して答えを見つけました。
マリオトモ

2

簡潔な答え:

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

説明:

私は答えがたくさんあるけど、私はただ個人的に、私はのように確かに「受け入れるだろうと、OPの質問に非常に近いものを投稿したいの端末でonelinerカウントダウン」。私の目標は:

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

使い方:

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

1
これは、Mac OSでbashスクリプトで使用する私のユースケースに最適です。それがどのように機能するかの説明は、非常に役立ちます。
ジェームスキャンベル

1

将来の参照のために、カウントダウン/カウントアップタイマー用の非常に簡単なコマンドラインオプションを備えたµTimerと呼ばれるコマンドラインツールがあります。


1

あなたがコマンドラインのストップウォッチを探している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
OS X El Capitanで試してみましたが、何らかの理由で16
00:

1

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'

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

http://www.cyberciti.biz/faq/create-large-colorful-text-banner-on-screen/参照してください


1

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

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

これは受け入れられた答えに似てcountdown()いますが、terdon's は私に構文エラーを与えました。ただし、これは私には最適です。

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

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

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



0

ストップウォッチの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

-2

何らかの理由でコンパイル可能なプログラムが必要な場合は、次のようにします。

#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 << "\033[2A\033[K";
    std::this_thread::sleep_for(milliseconds(100));
  }
  std::cout << "Finished" << std::endl;
  return 0;
}

これは、bash環境が利用できない場合、またはコンパイルされたプログラムを使用したい場合に、他のプログラムでも簡単に移植できます。

github

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.