Странная клавиатура при использовании sqlite shell на linux

9

Я использую коробку linux, соединенную через шпаклевку. Используя его с bash, моя клавиатура работает хорошо, но когда я использую оболочку sqlite (программа sqlite3), мои клавиши сходят с ума:

del=^[[3~
up=^[[A
left=^[[D
right=^[[C
down=^[[B

вот мой env (соответствующая часть):

TERM=linux
SHELL=/bin/bash
SHLVL=1
INPUTRC=/etc/inputrc

Я хотел бы использовать мои ключи нормально на sqlite, как я делаю на Windows.

мой ввод:

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

# Completed names which are symbolic links to
# directories have a slash appended.
set mark-symlinked-directories on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif
kurast
источник

Ответы:

9

(К сведению: это обычные последовательности, генерируемые этими клавишами на большинстве терминалов, их интерпретация зависит от терминала или программы / библиотеки. Вы можете показать это на рабочем терминале, нажав Ctrl+, vзатем нажав Endили другую не символьную клавишу, где Ctrl-V устанавливает следующее нажатие клавиши, которое будет обрабатываться буквально.)

Похоже, ваш sqlite3бинарный файл не используется readline, или конфигурация readline ( inputrc) bashне работает (хотя менее вероятно, если она работает нормально).

Вы можете быть в состоянии подтвердить / отклонить, если readline используется со следующими, замените which sqlite3на полный путь, если он не в вашем PATH.

ldd `which sqlite3` 

Если вы видите libreadline.soили похожее, то оно должно работать, поэтому проверьте INPUTRCпеременную окружения ~/.inputrcи /etc/inputrc. Там очень тонкий шанс это статический ( libreadline.a) для проверки попытки:

strings -a `which sqlite3`| grep -i inputrc

Если строки INPUTRC, ~/.inputrcили /etc/inputrcприсутствуют, похоже , Readline статически связаны между собой , и должен работать.

(В лучшем случае вы можете получить только некоторую базовую версию и информацию о компиляции ( pragma compile_optionsесли она поддерживается) sqlite3, но не полный набор функций, поэтому нам нужно копаться в бинарном файле.)

Если ни, lddни stringsуказать readline, то почти наверняка, что двоичный файл не имеет поддержки.

В противном случае проверьте этот ответ: SQLite с поддержкой readline в Ubuntu

Если у вас нет поддержки readline в вашем sqlite3бинарном файле, вы можете обернуть его одним из следующих способов :

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

Оба позволяют вам указать файл истории в командной строке.

Вы также можете проверить bashпривязки readline, просто чтобы убедиться, что readline работает и настроен, как и ожидалось:

bind -p | egrep '\[[ABCD3].?":'

В моей системе (работает bash-3.xвнутри rxvt) я получаю:

"\M-[3~": delete-char
"\M-[D": backward-char
"\M-[C": forward-char
"\M-[B": next-history
"\M-[A": previous-history

\Mэто «мета», что эквивалентно escape , так что там, где вы видите \M-«а \e», тоже должно работать. При печати escape отображается как ^[(control- [).

mr.spuratic
источник
Я добавил свой ввод, если вы можете посмотреть, чтобы исключить эту возможность
Кураст
и мой ldd из sqlite не показывает libreadline
kurast
1
Это , вероятно , не имеет realdine поддержки тогда, либо обновить пакет (проблемы совместимости проверки , если вам придется обновить версию), или использовать в rlwrapкачестве обходного пути. Ответ обновлен.
mr.spuratic
Мой бинарный файл не является статически связанным, и мой вывод bind похож на ваш. Тем не менее, у меня нет ни rlwrap, ни socat в моей установке, и у меня нет прав root для их установки.
kurast