Linux端末でリアルタイムのカウントダウンタイマーを表示するにはどうすればいいですか?これを行うための既存のアプリ、あるいはもっと良いのは1つのライナーがありますか?
なぜ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時間待つ必要がなかったため、何日もテストされていません。うまくいくはずですが、うまくいかない場合はお知らせください。
私の好きな方法は:
開始:
time cat
やめる:
ctrl+c
@wjandreaが以下にコメントしたように、別のバージョンが実行される予定です。
time read
そしてEnter
を押して停止します
私は同じことを探していて、Pythonでもっと手の込んだものを書いてしまいました。
これはあなたに簡単な10秒のカウントダウンをするでしょう:
Sudo pip install termdown
termdown 10
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への休暇を知っているように私の答えを上げておく。
私はこれを使った:
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"
これが ソースです 。
これは、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
}
}
私は非常に良い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にいます)そしてあなたは アラーム付きのシンプルで柔軟なタイマーを持っています !
他のアプローチ
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
は明らかに優れていました。
私は自分のシェルスクリプトを書いてしまいました: 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
自分のスクリプトで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ツールはあなたのためにこれを行います。
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()
今後の参考のために、カウントダウン/カウントアップタイマー用の非常に簡単なコマンドラインオプションを持つ µTimer というコマンドラインツールがあります。
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
あなたは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
}
単に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/ もご覧ください。
短い答え:
for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done
説明:
私は多くの答えがあることを知っていますが、私はOPの質問に非常に近い何かを投稿したいだけです。それは個人的には「oneliner countdown in terminal」として受け入れます。私の目標は次のとおりです。
使い方:
seq
は60から1までの数を表示します。echo -ne "\r$i "
は、文字列の先頭にキャレットを返し、現在の$i
値を出力します。現在の$i
(10 - > 9)よりも文字数だけ長い場合は、前の値を上書きする必要がある後のスペース。TermTime をご覧ください。これは端末ベースの時計とストップウォッチです。
pip install termtime
これは一般に認められている回答と似ていますが、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は分単位の時間です)。
ストップウォッチの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
ワークショップのための大きなカウントダウンタイマーを表示するための用語アプリケーションを探すとき、今日より早くこの質問を見つけました。提案のどれも私がまさに必要としていたものではなかったので、私はすぐにGoで別のものをまとめました: https://github.com/bnaucler/cdown
質問はすでに十分に答えられているので、これは後世のためであると考えてください。
$ 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/