Keyboard aneh ketika menggunakan shell sqlite di linux

9

Saya menggunakan kotak linux yang terhubung melalui dempul. Menggunakannya dengan bash, keyboard saya berkinerja baik, tetapi ketika saya menggunakan shell sqlite (program sqlite3) kunci saya menjadi gila:

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

inilah env saya (bagian yang relevan):

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

Saya ingin menggunakan kunci saya secara normal di sqlite, seperti yang saya lakukan di windows.

inputrc saya:

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

Jawaban:

9

(FYI: itu adalah urutan normal yang dihasilkan oleh tombol-tombol itu di sebagian besar terminal, terserah terminal atau program / perpustakaan untuk menafsirkannya. Anda dapat menunjukkan ini pada terminal yang berfungsi dengan menekan Ctrl+ vlalu menekan Endatau tombol non-karakter lainnya, di mana ctrl-V mengatur penekanan tombol berikutnya untuk diperlakukan secara harfiah.)

Sepertinya sqlite3biner Anda tidak menggunakan readline, atau konfigurasi readline ( inputrc) rusak (kecil kemungkinannya jika bashberfungsi dengan baik).

Anda mungkin dapat mengonfirmasi / menolak jika readline digunakan dengan yang berikut ini, ganti which sqlite3dengan path lengkap jika tidak ada di Anda PATH.

ldd `which sqlite3` 

Jika Anda melihat libreadline.soatau serupa, maka itu akan berfungsi, jadi periksa INPUTRCvariabel lingkungan Anda , ~/.inputrcdan /etc/inputrc. Ada peluang tipis yang terhubung secara statis ( libreadline.a), untuk memeriksa coba:

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

Jika string INPUTRC, ~/.inputrcatau /etc/inputrcada, sepertinya readline terhubung secara statis, dan seharusnya berfungsi.

(Paling-paling Anda hanya bisa mendapatkan beberapa versi dasar dan kompilasi informasi ( pragma compile_options, jika didukung) dari sqlite3, tetapi bukan set lengkap fitur, itulah sebabnya kami perlu mencari-cari biner.)

Jika tidak ada lddatau stringsmenunjukkan readline, maka hampir pasti biner tidak memiliki dukungan.

Kalau tidak periksa jawaban ini: SQLite dengan dukungan readline di Ubuntu

Jika Anda tidak memiliki dukungan readline dalam sqlite3biner Anda, Anda dapat membungkusnya menggunakan salah satu dari:

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

Keduanya memungkinkan Anda menentukan file histori pada baris perintah.

Anda juga dapat memeriksa bashbinding readline Anda , hanya untuk memastikan bahwa readline bekerja dan terkonfigurasi seperti yang diharapkan:

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

Di sistem saya (berjalan bash-3.xdalam suatu rxvt) saya mendapatkan:

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

\Madalah "meta", yang setara dengan melarikan diri , jadi di mana Anda melihat " \M-" a " \e" harus bekerja juga. Saat dicetak, escape direpresentasikan sebagai ^[(control- [).

mr.spuratic
sumber
Saya menambahkan inputrc saya, jika Anda bisa melihat untuk mengecualikan kemungkinan ini
kurast
dan ldd saya dari sqlite tidak menunjukkan libreadline
kurast
1
Ini mungkin tidak memiliki dukungan realdine kemudian, baik upgrade paket Anda (masalah kompatibilitas cek jika Anda harus meng-upgrade versi), atau penggunaan rlwrapsebagai solusi. Jawaban diperbarui.
mr.spuratic
Biner saya tidak terhubung secara statis, dan juga output bind saya seperti milik Anda. Namun, saya tidak memiliki rlwrap atau socat di instal saya, dan saya tidak memiliki akses root untuk menginstalnya.
kurast