Рейтинг:0

Как читать с тайм-аутом, не заставляя bash считать это ошибкой?

флаг us

У меня есть скрипт read_user_input.sh:

#!/бин/баш

# установить -е

prompt="bla? [Да/нет] "

пока верно; делать
    читать -p "$prompt" -n 1 -s -t 3 ответить
    случай $ответить в
        ""|Y|y) echo "bla!!!"; сломать;;
        N|n) echo "нет бла :( ты отстой"; break;;
        *) ;;
    эсак
сделано

Работает так, как я ожидал - т.е.

  • Пользовательский ввод "Y" -> bla
  • Пользовательский ввод "y" -> bla
  • Пользователь нажимает Enter -> bla
  • Тайм-аут -> бла

Однако при добавлении установить -е - чтение заканчивается с ошибкой > 128.

От читать --help:

Статус выхода:

Код возврата равен нулю, если не встречается конец файла, время чтения истекло (в этом случае оно больше 128), возникает ошибка присваивания переменной, или в качестве аргумента -u указан недопустимый файловый дескриптор.

Что было бы лучшим способом преодолеть это?

  1. добавление || истинный кажется неправильным, так как это скроет любые настоящие ошибки.
  2. я тоже не хочу удалять установить -е.
  3. Еще одна вещь, о которой я подумал, это справиться с этим в ловушка но это похоже на перебор
Рейтинг:2
флаг tm

Вместо добавления || истинный, установить $ответ к у если был тайм-аут:

    читать -p "$prompt" -n 1 -s -t 3 ответить || {
        ошибка=$?
        если (( $ошибка > 128 )) ; тогда
            ответ=у
        еще
            выход $ошибка
        фи
    }
CIsForCookies avatar
флаг us
Я использовал его немного по-другому, чтобы он соответствовал моему переключателю.
флаг tm
Я обновил ответ, чтобы код выхода соответствовал исходному, а не тому, который исходит от `$? > 128`.
CIsForCookies avatar
флаг us
Я думаю, что мой ответ дает тот же результат
флаг tm
Попробуйте изменить `read` на `XXXread` и посмотрите, какой код выхода вы получите в обеих версиях.
CIsForCookies avatar
флаг us
существует моя версия, которая идеальна
флаг tm
Да, но с кодом 1 вместо 127.
Рейтинг:0
флаг us

Используя ответ @choroba, я изменил свой случай переключения на:

#!/бин/баш

установить -е

prompt="bla? [Да/нет] "

пока правда; делать
    читать -p "$prompt" -n 1 -s -t 3 ответить || (($? > 128))
    случай $ответить в
        ""|Y|y) echo "bla!!!"; сломать;;
        N|n) echo "нет бла :( ты отстой"; break;;
        *) ;;
    эсак
сделано
Рейтинг:0
флаг cn

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

#!/бин/баш

установить -е

prompt="bla? [Да/нет] "

пока верно; делать
    case $(read -p "$prompt" -n 1 -s -t 3 ответ; эхо $ответ) в
        ""|Y|y) echo "bla!!!"; сломать;;
        N|n) echo "нет бла :( ты отстой"; break;;
        *) ;;
    эсак
сделано
флаг tm
Аналогично `||, он скрывает другие ошибки. true`, попробуйте запустить его с `

Ответить или комментировать

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