2016-09-16 3 views
1

Предположим, у меня есть сценарий, который действует как сигнал тревоги. Допустим, вы установите его в течение пяти минут, и он делает следующее:Как разрешить выполнение сценария оболочки во время выполнения?

printf '%s\n' 'Alarm set for 5 minutes' 
sleep 300 && printf '%s\n' 'Alarm!' 

Как я могу реализовать способ непрерывного мониторинга для ключа паузы, скажем, «р» или «SPC», а затем ждать, пока не будет нажата клавиша снова возобновить нормальное выполнение скрипта? Я хочу, чтобы пользователь мог приостановить будильник.

Редактировать: Чтобы уточнить, я хочу постоянно контролировать для клавиши паузы , а работает под другим кодом. Это в отличие от остановки исполнения для прослушивания на stin.

+1

Возможный дубликат [Нажмите кнопку ENTER или подождите 10 секунд, чтобы продолжить] (http://stackoverflow.com/questions/9483633/press-enter-or-wait-10 -seconds-to-continue) –

+0

Это не дубликат этого конкретного вопроса, так как здесь нет вызова или 'read'. –

ответ

1

Это можно легко сделать, если вы принимаете посылки сигнала в качестве метода для прерывания таймера:

#!/bin/sh 

printf '%s\n' 'Alarm set for 5 minutes. ^C to continue' 
sleep 300 & 
trap : INT 
if wait; then 
    echo Timer complete 
else 
    echo Timer aborted 
fi 

Обратите внимание, что эта реализация фактически не остановить sleep процесс, и если этот процесс делает что-то еще Значит, вы, вероятно, захотите его прекратить. (Вместо того, чтобы ничего не делать в ловушке, отправьте сигнал ребенку.)

0

Многие оболочки имеют встроенную функцию read, которая позволяет вам читать из stdin. Вы можете использовать это, чтобы сделать вашу программу интерактивной.

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

0

вы можете сделать, как показано ниже

// alarm running = true 
while true 
do 
    //running running is true resume or start alarm 
    /** pseudo code 
     if running == true 
      start or resume alarm 
     else 
      pause alarm 
     your alarm start or re 
    **/ 
    IFS= read -r -t 0.5 -n 1 -s holder && var="$holder" 
    if [ "$var" == "p" ] 
    then 
      #running = false 
     echo "You have pause your alarm " 
    elif [ "$var" == "R" ] 
    then 
     #running = true 
    echo "start your timer" 
    fi 
done