Не уверен, что это ответ на вопрос напрямую, но я думаю, что это связано - я блуждал, откуда берутся эти коды, и я наконец нашел:
Сначало немного сложно читать; для левой стрелки найдите «LEFT 4» в столбце «Key», а для последовательности, которую видит bash
, найдите пятый столбец «keymap» - «normal»), где он написан как «[D 1b 5b 44 "- это три байта (27, 91, 68), представляющие этот ключ.
Поиск потока Как читать клавиши со стрелками по действительно старому bash? - Форумы UNIX и Linux вдохновили меня написать короткий однострочный вкладыш, который сбрасывает коды клавиш нажатых клавиш. В основном, вы нажимаете клавишу, затем Enter (для запуска окончания read
), а затем используйте hexdump
для вывода того, что read
сохранил (и, наконец, нажмите Ctrl-C, чтобы выйти из цикла):
$ while true; do read -p?; echo -n $REPLY | hexdump -C; done
?^[[D
00000000 1b 5b 44 |.[D| # left arrow
00000003
?^[[C
00000000 1b 5b 43 |.[C| # right arrow
00000003
?^[[1;2D
00000000 1b 5b 31 3b 32 44 |.[1;2D| # Shift+left arrow
00000006
?^[[1;2C
00000000 1b 5b 31 3b 32 43 |.[1;2C| # Shift+right arrow
00000006
?^C
Итак, в то время как клавиши со стрелками требуют 3 байта - клавиши Shift + стрелки требуют 6! Однако, казалось бы, все эти последовательности начинаются с 0x1b (27), поэтому можно проверить это значение для read -n1
, прежде чем читать больше байтов; также 5b
остается вторым байтом в многобайтовой последовательности для столбцов «normal» и «shift / NUM-Lock» в таблице выше.
Изменить: намного проще и правильнее сканирование терминальных кодов нажатых клавиш в Linux осуществляется через showkey :
$ showkey
Couldn't get a file descriptor referring to the console
$ showkey -h
showkey version 1.15
usage: showkey [options...]
valid options are:
-h --help display this help text
-a --ascii display the decimal/octal/hex values of the keys
-s --scancodes display only the raw scan-codes
-k --keycodes display only the interpreted keycodes (default)
$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^[[A 27 0033 0x1b
91 0133 0x5b
65 0101 0x41
^[[B 27 0033 0x1b
91 0133 0x5b
66 0102 0x42
^[[A 27 0033 0x1b
91 0133 0x5b
65 0101 0x41
^[[D 27 0033 0x1b
91 0133 0x5b
68 0104 0x44
^[[C 27 0033 0x1b
91 0133 0x5b
67 0103 0x43
^C 3 0003 0x03
^M 13 0015 0x0d
^D 4 0004 0x04