Я играю со сценарием, который, помимо прочего, перечисляет список выбора. Как в:
1) Пункт 1 # (выделено) 2) Пункт 2 3) Пункт 3 # (выбранный) 4) Пункт 4
- Когда пользователь нажимает
down-arrowследующие пункты, выделяется - Когда пользователь нажимает
up-arrowпредыдущие элементы, выделяется - и т.п.
- Когда пользователь нажимает
tabэлемент - Когда пользователь нажимает
shift+tabвсе элементы выбираются / отменяются - Когда пользователь нажимает
ctrl+aвсе элементы выбраны - ...
Это отлично работает с текущим использованием, которое является моим личным использованием, когда вход фильтруется моей собственной настройкой.
Вопрос в том, как сделать это надежным на разных терминалах.
Я использую несколько хакерское решение для чтения ввода:
while read -rsn1 k # Read one key (first byte in key press)
do
case "$k" in
[[:graph:]])
# Normal input handling
;;
$'\x09') # TAB
# Routine for selecting current item
;;
$'\x7f') # Back-Space
# Routine for back-space
;;
$'\x01') # Ctrl+A
# Routine for ctrl+a
;;
...
$'\x1b') # ESC
read -rsn1 k
[ "$k" == "" ] && return # Esc-Key
[ "$k" == "[" ] && read -rsn1 k
[ "$k" == "O" ] && read -rsn1 k
case "$k" in
A) # Up
# Routine for handling arrow-up-key
;;
B) # Down
# Routine for handling arrow-down-key
;;
...
esac
read -rsn4 -t .1 # Try to flush out other sequences ...
esac
done
И так далее.
Как уже упоминалось, вопрос заключается в том, как сделать это надежным для различных терминалов: то есть, какие последовательности байтов определяют конкретный ключ. Это вообще возможно в bash?
Одна мысль состояла в том, чтобы использовать или tputили infocmpи фильтровать результат, данный этим. Я, однако, в затруднении, поскольку оба tputи infocmpотличаюсь от того, что я фактически читаю, фактически нажимая клавиши. То же самое касается, например, использования C над Bash.
for t in $(find /lib/terminfo -type f -printf "%f\n"); {
printf "%s\n" "$t:";
infocmp -L1 $t | grep -E 'key_(left|right|up|down|home|end)';
}
Последовательности доходности читаются так, как определено, например linux, но нет xterm, что устанавливается TERM.
Например, стрелка влево:
tput/infocmp:\x1 O Dread:\x1 [ D
Что мне не хватает?
zshимеется встроенная поддержка curses (в модуле zsh / curses) в дополнение к базовым запросам terminfo с его echotiвстроенным и $terminfoассоциативным массивом.

dialogвариантов или используйте язык с достойнойncursesподдержкой (например, perl или python, если вы хотите придерживаться языков «сценариев»).