回答:
なぜ必要なのか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
}
stopwatch
24時間待つのは本当に嫌だったので、関数は何日もテストされていないことに注意してください。動作するはずですが、動作しない場合はお知らせください。
bash
(けれども私はそれと一緒に暮らすことができ、ある私は期待して私も自分の.bashrcに睡眠を追加しているよりも高いです)。
date +%s
-$ date1))+%H:%M:%S) ";
echo -ne "$(date -ju -f %s $(($date1 -
date +%s )) +%H:%M:%S)\r"
;
私の好きな方法は:
開始:
time cat
やめる:
ctrl+c
以下で@wjandreaがコメントしたように、別のバージョンが実行されます。
time read
を押しEnter
て停止します
time read
time read
zshでは失敗しますが、time (read)
動作します。
私は同じことを探していて、最終的にはPythonでもっと手の込んだものを書くことになりました。
これにより、単純な10秒のカウントダウンが得られます。
sudo pip install termdown
termdown 10
これは、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
}
}
return $1
私は非常に良いテルドンの答えを、開始からの時間と終了までの時間を同時に表示する機能に組み合わせました。また、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
別のアプローチ
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ツールがこれを行います。
sleep 0.1
。何がsleepnh
(私はアーチレポでそれを見つけることができない)とどのように異なるんsleep
?私が知る限り、あなたは基本的に上記の私の答えと同じことをしています。私は何が欠けていますか?
sleep 5
いることの問題は、正確に5秒間眠らないことです。たとえばtime sleep 5
、試してみて、コマンドの実行に5秒以上かかることがわかります。時間が経つにつれて、エラーが蓄積されます。sleepenhユーティリティを使用すると、このエラーの蓄積を簡単に回避できます。
sleepnh
よりも優れているsleep
だけ他の回答が使用言う(sleep 1
そうではない-which 、OPのみがそれを使用します)およびii)標準ツールではないため、入手先とインストール方法。
sleep
との違いを説明しましたsleepenh
。とにかく、私はおそらくそれについて十分に明確ではなかったので、最後にそれをさらに拡張しました。ミリ秒の精度の問題は、sleep
一度呼び出したときに得られるものです。それらは時間の経過とともに蓄積し、ある時点で顕著になります。他の人が使うだけだとは言いませんでしたsleep 1
。私は彼らsleep 1
がビジーループを使用すると言った。彼らはまだそうしています。反例を示してください。回答sleep 0.1
は、sleep 1
エラーをより速く蓄積することを除いて、回答と同じです。
簡潔な答え:
for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done
説明:
私は答えがたくさんあるけど、私はただ個人的に、私はのように確かに「受け入れるだろうと、OPの質問に非常に近いものを投稿したいの端末でonelinerカウントダウン」。私の目標は:
使い方:
seq
60〜1の数字を出力します。echo -ne "\r$i "
文字列の先頭にキャレットを返し、現在の$i
値を出力します。現在の文字よりも文字数が長い場合$i
(10-> 9)、前の値を上書きする必要がある後のスペース。あなたがコマンドラインのストップウォッチを探している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時間で時計と日付を使用するだけです。大きなディスプレイ用のパッケージをインストールすることもできます...
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/も参照してください
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
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()
これは受け入れられた答えに似て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は分単位の時間です)。
ワークショップの大きなカウントダウンタイマーを表示するための用語アプリケーションを探しているときに、この質問を今日早く見つけました。提案はどれも私が必要としていたものではなかったので、Goで別の提案をすぐにまとめました:https : //github.com/bnaucler/cdown
質問はすでに十分に回答されているため、これは後世のためであると考えてください。
$スリープ1500 && xterm -fg yellow -g 240x80&
黄色のテキストが表示された大きな端末が表示されたら、立ち上がってストレッチしましょう!
注:-1500秒= 25分pomodoro-240x80 = 240文字の行と80行の端末サイズ。目立って画面をいっぱいにします。
クレジット:http : //www.linuxquestions.org/questions/linux-newbie-8/countdown-timer-for-linux-949463/
何らかの理由でコンパイル可能なプログラムが必要な場合は、次のようにします。
#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環境が利用できない場合、またはコンパイルされたプログラムを使用したい場合に、他のプログラムでも簡単に移植できます。
.zshrc
あなたの答えを読んだ後、これらの素晴らしい機能を私の権利に追加しました。今日、私countdown
は初めて使用し、かなり高いCPU使用率に気付きました。sleep 0.1
大幅に改善された(すべてのシステムで小数秒のスリープ時間がサポートされているかどうかわかりません)を追加しました。欠点はもちろん、表示の精度が低いことですが、最大の偏差で生きることができます。100ms。