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?) 타이머 w/alarm : 개선?

은 내가 pomodoro 작업/학습 기술 실험을 최근에 결정, 나는 보통 컴퓨터 작업하고 있기 때문에, 서로의 컴퓨터에서 실행 알람 카운트 다운/업 타이머를 자갈 할 수 있기를 원 나는 일하고있어. 간단히 말해, 분당 25 분 또는 5 분 간격으로 카운트 다운 한 다음 알람 소리가 들려 오기 때문에 리셋 할 때까지 울릴 것입니다. 나는 이것을 터미널에서 실행할 수있는 non-gui 솔루션으로 바꾸기를 원했습니다.

웹을 검색하면서 나는 위의 내용 (대부분 http://www.commandlinefu.com/commands/view/5886/countdown-clock에서 가져온 것)을 생각해 냈습니다. 카운트 다운하고 분 단위로 남은 시간을 표시하고 지정된 간격이 끝나면 ctrl + c이 입력 될 때까지 5 초마다 특유하지만 상당히 방해가되지 않는 시스템 벨 패턴을 재생합니다 ("삐"프로그램 사용). 스크립트가 실행 된 터미널에서.

내가 말했듯이, 내가 함께 쓴 것은 그것이 나의 필요를 적절하게 맞출 것처럼 보인다. 그러나 bash에 대한 나의 이해가 매우 제한되어 있기 때문에 스크립트를 보면서 bash 스크립팅 경험을 가진 사람이라면 누구에게나 분명해야한다. 나는이 스크립트에서 어떤 종류의 개선이 이루어질 수 있는지 여기에서 물을 것이라고 생각했다. 더 응축 될 수 있습니까? 그리고/또는 같은 목적을 달성하기 위해 다른 유틸리티를 사용할 수 있습니까? 의견을 보내 주시면 감사하겠습니다.

늦은 수정 : 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 

그 의미에 & &에 지점을 표시하지 않습니다. 나는 심지어 확신 할 수 없다. 과제의 논리적 인 가치는 무엇인가? 그러나 그것은 가정하는 것이 안전하며 성공적이다. 그래서 a

MIN=1; for ... 

으로 충분할 것입니다.이 2 라이너로

, 전체 MIN = 1, 당신은 어떤을 할 수 있으며, alloted 시간을 변경할 수 있도록 할 수 있습니다 당신은 단지 다른 한편으로

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)과 같이 스크립트를 실행 (디렉터리에서 스크립트 파일입니다) :

# 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

이것은 내 원래의 렌더링과 비슷합니다. sleep 5m && while :; 경고음을 내십시오 -r 25 -l 10; 수면 5; 완료되었습니다. 5 분이되면 5 분이 지나면 명령이 수동으로 끝날 때까지 (ctrl c) 5 초마다 지정된 경고음 명령을 재생합니다. 대략 5 분 간격 내에서 실행중인 카운트 다운이 현재 위치하는 곳을 보여주는 시각적 타이머를 추가하여 해당 버전을 향상시키고 자했습니다. 내가 찾던 스크립트에서 내가 찾고있는 기능 향상 (수치 카운트 다운)을 추가 할 수있었습니다. 내 목표가 조금 더 명확 해지기를 바랍니다. – MJiller

+0

위 스크립트를 편집 할 수는 있지만 다른 대답이 있으므로 더 나은 해결책을 선택하십시오 :) – Matovidlo