Чтение с терминала без ожидания [ENTER]

Адаптация моего ответа Debian 9 к Debian 10:

  • включить бэкпорты:

    echo deb http://deb.debian.org/debian buster-backports main contrib non-free | sudo tee /etc/apt/sources.list.d/buster-backports.list
    sudo apt update
    
  • установить портированное ядро ​​:

    sudo apt install -t buster-backports linux-image-amd64
    

    (новое ядро ​​будет установлено вместе с вашим текущим ядром, так что вы всегда сможете загрузить последнее, если что-то пойдет не так)

  • установить прошивку:

    sudo apt install -t buster-backports firmware-linux
    

На момент написания этой статьи будет установлена ​​версия ядра 5.7.10 с прошивкой от августа 2020 года .

0
02.11.2020, 14:36
2 ответа

Если вы имеете в виду чтение --встроенной оболочки, то у нее есть возможность вернуться после чтения N символов, а не ждать нажатия клавиши ENTER. Попробуйте:

read -n1 ; echo You entered $REPLY

Кроме того,read --help

1
18.03.2021, 22:52

Причина, по которой вам нужно нажать Enter , заключается в том, что драйвер устройства терминала (код ядра позади устройства /dev/tty*или /dev/pt*, а не физическое устройство с клавиатурой и контролирует вас взаимодействие с )реализует базовый построчный редактор.

Когда приложение выполняет системный вызов read()для дескриптора файла, открытого, например, на /dev/pts/0, этот read()возвращает только полное содержимое строки, которую вы ввели (и, возможно, отредактировали с помощью Backspace , Ctrl+U , Ctrl+W ... )при нажатии Enter (и с символом CR, отправленным вашим терминалом, когда вы нажмите Введите , преобразованное в LF ).

Чтобы отключить этот редактор строк, вам необходимо выдать определенные управляющие инструкции для этого драйвера устройства. И здесь в игру вступает команда stty.

С stty -icanonэтот строковый редактор отключен(stty cbreakвместо этого был необходим в некоторых системах, и вы обнаружите, что stty cbreakчасто поддерживается в качестве альтернативы ).

Когда не используется этот режим icanon, некоторые другие параметры используются для настройки этого прямого режима:

  • ^C, ^Zпо-прежнему вызывают прерывание/приостановку. И вам нужно stty -isig, чтобы отключить их, чтобы они передавались как -в приложение для чтения.
  • ^Q, ^Sпо-прежнему используются для управления потоком(stty -ixonдля отключения ).
  • CRпо-прежнему преобразуется в LF, и вам потребуется stty -icrnl, чтобы отключить его.

stty raw— это ярлык для отключения всех этих и некоторых выходных обработок. Если в дополнение к этому вы добавите -echo, то ваше /dev/pts/1устройство будет действовать как простой проход -между вашим терминалом и приложением, взаимодействующим с ним.

Так:

saved_settings=$(stty -g)
stty raw -echo
byte=$(dd bs=1 count=1 2> /dev/null)
stty "$saved_settings"

Подготовит ровно один байт (, не являющийся символом, не говоря уже о последовательности символов, которую ваш терминал может отправить при нажатии какой-либо клавиши )с терминального устройства, как только он будет отправлен вашим терминалом.

За исключением ksh (, когда включены опции vi/ emacs/ gmacs, где ksh реализует свой собственный редактор строк, см. varedв zshили read -eв bash для эквивалента )встроенная функция readпо умолчанию не изменяет настройки терминального устройства, поэтому все равно придется ждать, пока введите , чтобы получить что-либо с терминального устройства.

Однако readвстроенная функция zsh (с параметрами -kили -q)и ksh93, bash или mksh (с параметрами -nили -N)] отключит этот режим icanon, чтобы иметь возможность вернуться по одному нажатию клавиши, когда они получают ввод с терминального устройства.(isigне отключен, поэтому вы все равно можете прервать сценарий с помощью Ctrl+C например ).

0
18.03.2021, 22:52

Теги

Похожие вопросы