2014-01-20 5 views
1

http://milkteafuzz.com/j/2012/02/22/a-simple-bash-alarm-clock/에있는 매우 간단하면서도 효과적인 알람 스크립트를 해킹하여 터미널에서 명령이 실행될 때 사용자 입력을 받아 들일 수 있습니다.이 매개 변수는 3 개의 매개 변수 중 하나 일 수 있습니다. 시간, 경보 음 파일 또는 경보 제목-msg를 표시합니다. 입력이 읽히지 않으면 스크립트는 사용자에게 기본 사운드 파일을 사용하는 알람의 날짜 시간과 표시 할 alarm title-msg을 입력하라는 메시지를 표시합니다.알람 스크립트가 백그라운드에서 실행되지만 사용자 입력을 받아 들여 정지하지 않음

알람이 울리면 사용자에게 'Enter'키를 눌러 알람을 중지하라는 메시지가 표시됩니다.

실행할 때 백그라운드에서 실행되지만 사용자가 알람을 중지하도록 허용하고 싶지만 솔루션을 구현하지 못하는 것 같습니다. 여기

내가 기압 (간결함을 위해 생략 기능) :이 무엇

echo "" 

#'if' user input $1 is supplied 
if [[ -n "$1" ]] ; then 
    if [[ "$1" =~ [0-2]{0,1}[0-9][:]{1}[0-9]{1,2} ]] ; then  #'if' input $1 matches date-time format 
     date="$1" #; echo "\$date: ${date}" 
    elif [[ "$1" =~ ^.*\.(mp3|ogg)$ ]] ; then #'if' input $1 has mp3/ogg ext 
     fChkFile "$1" #funct call 
    else #'else' it is assumed input $1 is alarm title-msg to display when alarm goes off 
     msg="$1" #; echo "\$msg: ${msg}" 
    fi 
fi 

#'if' user input $2 is supplied 
if [[ -n "$2" ]] ; then 
    fInput23 "$2" #funct call 
fi 

#'if' user input $3 is supplied 
if [[ -n "$3" ]] ; then 
    fInput23 "$3" #funct call 
fi 

if [[ -z "$date" ]] ; then  #'if' date-format IS null then not detected from user input and so prompt user for one 
    printf "What time should the alarm sound? " 
    read date 
    if [[ -z "$date" ]] ; then  #'if' "$date" IS still null then abort 
     notify-send "Aborting. A date-time format is required and none was detected." 
     exit 67 
    fi 
fi 

if [[ -z "$msg" ]] ; then  #'if' title-message IS null then assign default 
    msg="The time has arrived to sit up and take notice..." #; echo "\$msg: ${msg}" 
fi 

if [[ -z "$sndF" ]] ; then  #'if' sound file IS null then assign default 
    sndF="/media/multiMediaA_intHdA720Gb/music/theStrokes_isThisIt/07_lastNite.mp3" #; echo "\$sndF: ${sndF}" 
fi 

echo -e "\n\t\033[1;36mOkay! Will alert you on:\033[1;32m" $(date --date="$date")"\033[0m\n" 

sleep $(($(date --date="$date" +%s) - $(date +%s))); 
notify-send "$msg" -t 0 
#while true; do 
    /usr/bin/mpg123 -q -l 0 "$sndF" & 
    sleep 1 
    read -ep $'\n\033[1;33mHit Enter key to stop the alarm.\033[0m\n' killAlm 
    #almPid=$(ps aux|grep "\/usr\/bin mpg123"|cut -d' ' -f3) #; echo "\$almPid: ${almPid}" 
    almPid=$(ps aux|grep "\/usr\/bin mpg123"|sed -r 's/^[^ \t]*[ \t]*([0-9]{3,5})[ \t]*.*$/\1/') #; echo "$almPid" 
    kill "$almPid" 
#done 

같이 스크립트는 벌금과 멋쟁이 실행하지만 각각의 터미널을 묶는의 생각처럼 정말하지 않습니다 알람 세트 (내 기억은 체와 같으며 주어진 시간에 여러 개의 알람을 사용하는 경향이 있습니다). 어떻게하면 스크립트를 실행하고, 입력을 받아 들일 수 있습니까? (최소한 날짜 - 시간 변수는 var) BG에서 실행하여 터미널을 비우지 만, 하나가 꺼지면 알람을 중지하도록 사용자에게 프롬프트합니까?

편집 : 화면 사용법은 아래의 설명에서 언급 한대로 올바르게 작동합니다. 그러나 어떤 이유로, 갑자기 (처음으로 '화면'솔루션을 시도하기 때문에), MPG 프로세스가 걸려되는 명확하지 않습니다와 지금 이전 절차를 취소하려고하기 때문에 너무

kill "$almPid" 

실패 매달아. 그래서 나는 각 mpg pids를 연속적으로 죽이는 사이클을 반복했다. 확실히, 꽤 좋지는 않지만 작동하는 것처럼 보인다. 내가 스트리밍 음악에 대담하게 사용할 수있는 좋은 점은 mpg pids를 죽이기 위해 자전거를 돌리는 것이 아무것도 망가 뜨리지 않는다는 것입니다. 당연히 같은 시간에 여러 개의 경보가 울리는 경우가 아니면.

#almPid=$(ps aux|grep "\/usr\/bin mpg123"|sed -r 's/^[^ \t]*[ \t]*([0-9]{3,5})[ \t]*.*$/\1/') #; echo "$almPid" 
    for p in $(ps aux|grep "\/usr\/bin mpg123"|sed -r 's/^[^ \t]*[ \t]*([0-9]{3,5})[ \t]*.*$/\1/') ; do 
     # echo "\$p: $p" 
     kill "$p" 
    done 

답변

2

"화면"명령 나는 전경에 스크립트를 가지고 호출 쉘을 강제 할 수있는 방법이라고 생각하지 않습니다

exemple here

+0

또한 탭이있는 터미널 에뮬레이터를 사용합니다. 화면은 더욱 다양하지만. – Graeme

+0

화면 명령은 kewl (ish) 아이디어입니다. 나는 외면적으로 스크린에 익숙하지만 이전에는 사용하지 않았다. 이미 설치되어 있기 때문에 나는 그걸 가지고 놀았고 잘 작동합니다. 하나의 터미널을 알람 당 하나씩 열어 놓는 것보다 낫다. (나는 터미네이터를 사용하기 때문에 알람 당 하나의 탭이 실제로 사용된다.) – nanker

+0

<일시 중지 : 5 분 편집 제한 시간>하지만 'for'루프를 추가해야했는데 (왜 그런지 모르겠다) 화면을 죽이려고했는지 여부를 알 수없는 mpg pid가 매달려 있습니다. mpg pid 실행 중. 이상적이지는 않지만 나는 더 나은 것을 읽고 생각할 때까지는 지금 당장 일합니다.여러 알람을 실행하는 '화면'명령에 대한 단일 탭이 작동합니다. – nanker

0

으로 시도합니다. 대개 fg을 사용하여이 작업을 수동으로 수행하고 Enter 키를 누른 다음 CRTL-Z를 사용하여 배경으로 되돌립니다.

경보가 유일한 배경 작업 (또는 가장 최근의 작업)이면 fg이면 충분합니다. 그렇지 않다면 jobs으로 백그라운드 프로세스의 작업 번호를 볼 수 있습니다. 작업 번호를 fg의 인수로 제공하십시오.

자세한 내용은 man bash의 '직업 제어'섹션을 확인하십시오.

관련 문제