2015-12-24 2 views
7

Привет Я пытаюсь реализовать событие, которое произойдет после 5-секундного обратного отсчета, если не нажать клавишу. Я использую этот код, но он терпит неудачу, если я нажимаю клавишу ввода или пробел. Он не работает в том смысле, что ввод или пробел определяются как «".Нажмите любую клавишу, чтобы прервать через 5 секунд

echo "Phoning home..." 
key="" 
read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key 
echo 
if [ "$key" = "" ]  # No Keypress detected, phone home. 
    then python /home/myuser/bin/phonehome.py 
    else echo "Aborting." 
fi 

После прочтения этого поста, Bash: Check if enter was pressed

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

+2

Что произойдет, если вы установили фиктивное значение вверху для ключа, то есть 'key = notesuch'? Удачи. – shellter

+0

Это действительно хорошая идея. Благодаря!!! – inkman

ответ

2

accepted answer в linked question обложка "обнаружение enter" вопрос. Вы смотрите код выхода от read.

Что касается областей обработки, то есть два ответа.

Проблема с пространством заключается в том, что при нормальных условиях read обрезает ведущие и конечные пробелы с ввода (и разбивает слово на вход) при назначении ввода заданным переменным.

Есть два способа избежать этого.

  1. Вы можете избежать использования пользовательских имени переменной и использовать $REPLY вместо этого. При назначении на $REPLY не выполняется прокрутка пробелов или разбиение слов. (Хотя, глядя на это сейчас, я не могу найти это в спецификации POSIX, так что это может быть нестандартное и/или не переносное расширение какого-то рода.)

  2. Явно задано IFS пустой строке для команды read, чтобы она не выполнялась и не искажала пробел или разбиение слов.

    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $? 
    # Press <space> 
    0 
    $ declare -p key 
    declare -- k=" " 
    $ unset -v k 
    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $? 
    # Wait 
    1 
    $ declare -p key 
    -bash: declare: k: not found 
    
4

read руководство говорит:

Код возврата read равен нулю, если конец из файла не встречается или читать раз вне.

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

#!/bin/bash 
if read -r -s -n 1 -t 5 -p "TEST:" key #key in a sense has no use at all 
then 
    echo "aborted" 
else 
    echo "continued" 
fi 

Ссылка: Read Manual
Примечание: Упор в цитате мой.

+0

Этот способ казался самым изящным, и я так и делал это. Большое спасибо за ответ. – inkman

+0

@inkman: Добро пожаловать. – sjsam

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