2016-10-17 13 views
0

MIN=1 && for i in $(seq $(($MIN*5)) -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; sleep 5; donebashカウントダウン(up?)タイマー付き/アラーム:改善?

私はpomodoro作業/学習技術を試すことが最近決めたと、私は通常、コンピュータで作業しておりますので、一緒にマシン上で実行されるアラーム付きカウントダウン/アップタイマーを考え出すことが可能になりたかったです私は働いています。簡単に言えば、25分または5分の間隔を分単位でカウントダウンした後、アラーム音が鳴ります。リセットするまでアラーム音が鳴ります。私はこれをターミナルから実行できるnon-guiソリューションにしたいと思った。

ウェブを検索すると、上の図のように(ほとんどはhttp://www.commandlinefu.com/commands/view/5886/countdown-clockから取得)何かを考え出した。カウントダウンして残り時間を分単位で表示し、指定された間隔が終了すると、特有ではあるが非侵入型のシステムベルパターン(「ビープ音」プログラムを使用)を5秒ごとに実行してctrl + cと入力しますスクリプトが実行された端末で

私が言ったように、私がまとめたものは、自分のニーズに適切に合うようです。しかし、私のbashに対する理解は非常に限られているので、スクリプトを見て、bashスクリプトの経験を持つ人には明らかであるはずです。私はこのスクリプトにどのような改善が加えられるのかここで尋ねると思いました。さらに凝縮することができますか、あるいは同じ目的を達成するために異なるユーティリティを使用することができますが、もっとエレガントにできますか?入力をいただければ幸いです。

続き編集:ゾルタンがMIN=1 && for i in $(seq $(($MIN*5)) -1 1);for i in $(seq 5 -1 1);に置き換えることを提案しました。これは私が投稿したスクリプトをやや単純化して改良したようです。したがって、1つのライナーとしてのより賢明なバージョンは、for i in $(seq 5 -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; printf " # "; sleep 5; doneとなります。彼が投稿したバージョンは、はるかに機能が豊富で柔軟なスクリプトと思われるので、私はそれを最高の答えとしてマークします。利用可能なオプションがあるのは良いことですが、私は先に進んで私が作成したバージョン(Zoltanによって提案されたわずかな改良を含み、ビープ音が鳴るたびにハッシュ記号が追加されると思っていました[私がコンピュータを離れるべきである場合に備えて、何時間鳴っているのかのアイデアを与えるために - printf " # "の部分)がスクリプトにハードコードされています。入力いただきありがとうございます。

答えて

1

あなたのスクリプトは十分だと思います。私は本当にそれが意味

MIN=1 && for 

で& &にポイントが表示されていない

第1項は成功した場合、にのみ、第二項を実行します。私は、割り当ての論理的な価値は何であるかは分かりませんが、それが成功すると仮定するのは安全です。したがって、

MIN=1; for ... 

で十分です。この2ライナー用として

、全体MIN = 1は無意味なようで、あなただけの一方

for i in $(seq 5 -1 1); do ... 

を書くことができ、あなたはすることができ、alloted時間を変更できるようにしたいかもしれませんこのように達成:

1)beeper.shのようなファイル

2)ユーザーによってそれを実行可能にするを作成

chmod u+x beeper.sh 

またはすべてのユーザによって:

chmod a+x beeper.sh 

3)少し微調整して、ファイル内のスクリプトを記述します。

#!/bin/bash 

# default timeout 
timeout_mins=5 
# while testing your script, making changes, you want this to be something like 1 or 2 
sec_per_min=60 

# check for command line input 
if [ 0 -ne $# ] 
then 
    # assign the first command line param, no check, if it is a number, though! 
    timeout_mins=$1 
fi 

# now it does make sense, to have a variable in the for loop core 
for i in $(seq $timeout_mins -1 1) 
do 
    echo -n "$i, " 
    sleep $sec_per_min 
done 

while : 
do 
    beep -r 25 -l 3 
    sleep 5 
done 

4)ディレクトリからスクリプトファイルがある(このようなあなたのスクリプトを実行します):

# using the default time 
./beeper.sh 

# using 9min 
./beeper.sh 9 

# invalid input: the seq will fail -> the for will fail -> execute the beep 
./beeper.sh bla 
+0

私はこのスクリプトを試してみました。それは私が最初に投稿したものよりはるかに柔軟で能力があります。だから私はこのソリューションを最善の答えとしてマークしますが、最初に投稿したスクリプトを少し修正したバージョンを引き続き使用する予定です。 – MJiller

0

あなただけの私はあなたがその状態に戻って取得し、サブシェルで実行あなたはいくつかの時間のビープ音のために眠ることができるサイクルのためにそれを必要といけないと思うビープ音を呼び出す以内にあなたが無限ループを行うことができます

#infinite loop with beep man beep to understand better -r and -l switch 
time=$((60*5)) 
current=0 
while : 
do 
#echo "Current time is: " 
#date | egrep -o [0-9]+:[0-9]+:[0-9]+ 

    current=$(($current+$time/60)) 
    echo "time of execution : $current min"; 
    beep -r 25 -l 10 
    sleep $time 
done 

私は私はあなたの問題をよく理解しているかどうかは分かりませんが、解決策はあなたが上に投稿したそのwihchよりも簡単にはなりません。

+0

これは、私のオリジナルのレンディションとよく似ています - スリープ5m && while:;ビープ音を鳴らす-r 25 -l 10;スリープ5;完了しました。これは5分とカウントされ、音が鳴りません。その後、5分が経過すると、コマンドが手動で終了するまで(ctrl c)、指定されたビープ音を5秒ごとに再生します。私は、5分間隔のどこで、現在実行中のカウントダウンが現在位置付けられているかを示す目に見えるタイマーを追加して、そのバージョンを強化したかったのです。私が見つけたスクリプトは、私が探していた機能強化(数値のカウントダウン)を追加することを可能にしました。私は今、私の目標が少しはっきりしていることを願っています。 – MJiller

+0

私は上記のスクリプトを編集することができますが、それを確認することはできますが、別の答えがありますので、より良い解決方法を選択してください:) – Matovidlo