Это может быть излишним, но вы можете получить это, используя read -e
, который включает средство Readline в утилите read
. В этот момент желаемый результат будет состоять только из привязки одной клавиши -.
Осторожно, однако, что Readline также содержит множество других функций, таких как завершение, история и т. д., которые вам могут не понадобиться для простого read my_variable
. Если это нежелательно, вы должны явно очистить привязки клавиш -и отключить функции, которые вам не нужны для вашего read -e
.
Пример доказательства -концепции -из командной строки -:
(bind 'TAB: accept-line'; IFS= read -re var && echo "$var" || echo ko)
Вы также можете сделать это в сценарии, хотя bind
выдаст предупреждение (, которое вы все равно можете отключить, перенаправив2>/dev/null
).
Альтернативой командам bind
в скрипте является предоставление пользовательского файла inputrc перед вызовом скрипта, на который вы хотите повлиять. Нет необходимости иметь настоящий файл, достаточно здесь документа.
Приведенный выше пример сделан с помощью скриптов:
#!/bin/bash
export INPUTRC=/dev/fd/3
script2.sh 3<
Приведенный выше сценарий подготавливает пользовательский файл inputrc в качестве документа «Здесь» в файле -с дескриптором 3, который интерпретатор script2.sh
будет считывать, как указано в переменной окружения INPUTRC
.
Тогдаscript2.sh
:
#!/bin/bash
echo start
bind -q accept-line 2>/dev/null # shows which keys are configured to accept input
IFS= read -re var && echo "$var" || echo ko
echo end
Перед ожиданием ввода на read
скрипт напечатает что-то вроде:
accept-line can be invoked via "\C-i", "\C-j", "\C-m".
показывает, что Вкладка(т.е. Ctrl -I показано выше, так как\C-i
)принимает строку точно так же, как Возврат(т.е. Ctrl -M , каретка -возврат )или новая строка(Ctrl -J).
Более "реальный" пример:
#!/bin/bash
bind 'TAB: accept-line' &>/dev/null
echo "enter your name:"
IFS= read -re var
echo "your name is: $var"
Если вы пойдете по этому пути, ознакомьтесь с руководством пользователя Readline , по крайней мере, сокращенным в вашем man bash
. Параметр set convert-meta off
среди прочих заслуживает особого упоминания, чтобы обеспечить лучшую поддержку символов ascii, отличных от -.