2016-10-17 10 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 обратный отсчет (вверх?) Таймер w/будильник: улучшения?

я решил недавно экспериментировать с/техника обучения pomodoro работы и, так как я обычно работаю с компьютером, хотел, чтобы иметь возможность сколотить обратный отсчет/вверх таймер с тревогой, которая работает на компьютере в который я работаю. Вкратце, я хотел посчитать минутный или минутный интервал 25 минут или 5 минут, затем подать звуковой сигнал - звуковой сигнал, который будет звучать до сброса. Я хотел, чтобы это, кстати, было не-gui-решением, которое я могу запустить с терминала

Поиск в Интернете, я придумал что-то, что работает (в основном взято из http://www.commandlinefu.com/commands/view/5886/countdown-clock) - см. Выше. Он подсчитывает и отображает время, оставшееся на минуты, и, когда указанный интервал заканчивается, он воспроизводит отличительный, но довольно ненавязчивый шаблон колокола системы (использует программу «звуковой сигнал») каждые 5 секунд, пока не будет введен ctrl + c в терминале, с которого был запущен скрипт.

Как я уже сказал, все, что я собрал, похоже, удовлетворит мои потребности адекватно. Но так как мое понимание bash довольно ограничено, так как, глядя на сценарий, должно быть очевидно любому, у кого есть опыт работы с bash-скриптами - я думал, что спрошу здесь, какие улучшения могут быть внесены в этот скрипт? Может ли он быть сконденсирован и/или, возможно, использовать разные утилиты для достижения того же конца, но более элегантным образом? Вход будет оценен.

LATER EDIT: предложение Zoltan о замене MIN=1 && for i in $(seq $(($MIN*5)) -1 1); на for i in $(seq 5 -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. Версия, которую он опубликовал, кажется гораздо более способным и гибким сценарием, поэтому я буду отмечать его как лучший ответ. Хотя хорошо иметь такой вариант, я думаю, что я продолжу и придерживаюсь версии, которую я создал (в том числе небольшое улучшение, предложенное Золтаном, и одно, которое я придумал, добавляя знак хеша каждый раз, когда звуковой сигнал выключается [ для того, чтобы дать мне представление, если я должен покинуть компьютер, как долго он сидел) - часть printf " # "), которая имеет временный интервал, закодированный в сценарий. Спасибо за ввод.

ответ

1

Я думаю, что ваш сценарий достаточно справедлив.

Я не вижу смысла в & & в

MIN=1 && for 

это означает, если первое слагаемое успеха, только затем выполнить второй срок. Я даже не уверен, какова логическая ценность задания, но можно с уверенностью предположить, что это успешно. Таким образом, должно быть достаточно

MIN=1; for ... 

должно быть достаточно.

Что касается этого 2-вкладыша, вся MIN = 1 кажется бессмысленной, Вы могли бы просто написать

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

С другой стороны, Вы могли бы хотеть, чтобы быть в состоянии изменить предоставленное для времени, которое может быть достигается так:

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) выполнить сценарий, как это (из директории файл скрипта in):

# 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 

Я не уверен, что я хорошо понимаю вашу проблему, но решение зависит только от вас, если вы хотите, чтобы таймер считал каждую минуту, тогда решение не может быть проще, чем то, которое вы отправили ВЫШЕ.

+0

Это очень похоже на мою оригинальную rendtiion - sleep 5m && while:; do beep -r 25 -l 10; сон 5; сделанный . Это составляет 5 минут - без звука - затем, когда 5 минут вверх, воспроизводит указанную звуковую команду каждые 5 секунд, пока команда не закончится вручную (ctrl c). Я хотел бы улучшить эту версию, добавив видимый таймер, который будет отображаться примерно так, где в течение 5-минутного интервала в текущий момент был установлен обратный отсчет. Сценарий, который я нашел, позволил мне добавить усовершенствование (числовой отсчет), который я искал. Надеюсь, теперь моя цель немного ясна. – MJiller

+0

Я отредактировал сценарий выше, вы можете проверить его, но есть еще один ответ, поэтому выберите лучшее решение :) – Matovidlo

 Смежные вопросы

  • Нет связанных вопросов^_^