Intereting Posts
Почему 'if ' ветвь всегда выбрана, даже если $ 1 не 1? Ssh логин / shell не полностью работает (как раньше) максимальный размер прокрутки оконного менеджера экрана Как получить значения для «set root» в menuentry, установив пароль для GRUB2 на CentOS 7 Ошибка сравнения регулярных выражений Bash для шестнадцатеричного байта \ x01 В чем разница между kill, pkill и killall Как получить новые форматы файловой системы для использования в mkfs? Редактируйте файл с помощью скрипта, но сохраняйте теги osx crontab каждые 12 часов – когда он отправит электронное письмо? avconv создает файлы, продолжительность которых неверна Сортировка вывода поиска до трубопровода в openssh Какие файловые системы можно сократить в 2011 году? Host linux distro без GUI? Не можете захватить группу регулярных выражений? Как я могу скомпилировать, установить и запустить инструменты внутри ядра / инструментов?

Как игнорировать входной буфер клавиатуры между двумя `read`

Когда я запускаю скрипт вроде

read -n 1 -p 'Enter first variable: ' var1 if echo "${var1}" | grep -iq "^y" then echo "okay" else echo "not okay" fi sleep 2 read -n 1 -p 'Enter second variable: ' var2 if echo "${var2}" | grep -iq "^y" then echo "okay" else echo "not okay" fi 

Если я запустил этот код, нажмите y, а затем нажмите n в промежутке в 2 секунды, n будет сохранено в буфере и передано следующему read поэтому он не ждет и запрашивает ввод пользователя для Enter second variable: просто дает ключ в буфере, т. е. здесь.

Для ясности я перефразирую свой вопрос разными словами в следующих вопросах, но вопрос только один.

Как остановить ключи, буферизованные в памяти? ИЛИ

Как игнорировать вход пользователя в буфер для второй переменной var2 ? ИЛИ

Как отключить / игнорировать ввод с клавиатуры между моим первым и вторым read чтобы независимо от того, что я набираю в промежутке в 2 секунды после первого read , он не переходит в качестве ввода ко второму read

    Вы хотите вызвать tcflush() POSIX, чтобы очистить ожидающий ввод.

    Например:

     perl -MPOSIX -e 'tcflush 0,0' 

    Если вы используете оболочку bash , то простым способом вы можете попробовать прочитать один символ из ввода, используя тайм-аут почти 0. Это возвращает true, если что-то было прочитано, поэтому вам нужно попробовать еще раз. Например, поместите эту функцию в начале вашего скрипта и вызовите ее между сном и следующим следующим:

     flush(){ while read -N 1 -t 0.01 do : done }