Teclado estranho ao usar shell sqlite no linux

9

Eu uso uma caixa de linux conectada através de massa. Usando-o com o bash, meu teclado tem um bom desempenho, mas quando estou usando o shell sqlite (programa sqlite3) minhas teclas ficam loucas:

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

aqui está o meu env (a parte relevante):

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

Eu gostaria de usar minhas chaves normalmente no sqlite, como faço no Windows.

meu inputrc:

# 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
fonte

Respostas:

9

(FYI: essas são as seqüências normais geradas por essas teclas na maioria dos terminais, cabe a um terminal ou programa / biblioteca interpretá-las. Você pode mostrá-lo em um terminal em funcionamento pressionando Ctrl+ e vdepois pressionando Endou outra tecla sem caractere, em que ctrl-V define o próximo pressionamento de tecla a ser tratado literalmente.)

Parece que o seu sqlite3binário não está usando readlineou a configuração do readline ( inputrc) está quebrada (menos provável se bashestiver funcionando bem).

Você pode confirmar / negar se a linha de leitura está sendo usada com o seguinte, substitua which sqlite3pelo caminho completo se não estiver na sua PATH.

ldd `which sqlite3` 

Se você vê libreadline.soou algo parecido, deve funcionar, portanto verifique sua INPUTRCvariável de ambiente ~/.inputrce /etc/inputrc. Há uma pequena chance de vincular estaticamente ( libreadline.a), para verificar a tentativa:

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

Se as strings INPUTRC, ~/.inputrcou /etc/inputrcestão presentes, parece que a linha de leitura estava vinculada estaticamente e deve funcionar.

(Na melhor das hipóteses, você pode obter apenas algumas versões básicas e compilar informações ( pragma compile_optionsse suportadas) sqlite3, mas não o conjunto completo de recursos, e é por isso que precisamos dar uma olhada no binário.)

Se nem lddnem stringsindicar a linha de leitura, é quase certo que o binário não tem suporte.

Caso contrário, verifique esta resposta: SQLite com suporte a readline no Ubuntu

Se você não possui suporte ao readline em seu sqlite3binário, pode envolvê- lo usando um dos seguintes:

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

Ambos permitem especificar um arquivo de histórico na linha de comando.

Você também pode verificar as bashligações da linha de leitura, apenas para garantir que a linha de leitura esteja funcionando e configurada conforme o esperado:

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

No meu sistema (executando bash-3.xdentro de um rxvt), recebo:

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

\Mé "meta", que é equivalente a escape , portanto, onde você vê " \M-" a " \e" também deve funcionar. Quando impresso, escape é representado como ^[(controle- [).

mr.spuratic
fonte
Eu adicionei meu inputrc, se você pudesse dar uma olhada para excluir esta possibilidade
Kurast
e meu ldd do SQLite não mostra libreadline
Kurast
11
Ele provavelmente não tem suporte realdine então, quer atualizar seu pacote (problemas de compatibilidade verificar se você tem a versão upgrade) ou uso rlwrapcomo uma solução alternativa. Resposta atualizada.
mr.spuratic
Meu binário não está vinculado estaticamente e também minha saída de ligação é como a sua. No entanto, eu não tenho rlwrap ou socat na minha instalação e não tenho acesso root para instalá-los.
Kurast