在Linux上使用sqlite shell时出现奇怪的键盘


9

我用一个Linux盒子连接槽式腻子。将其与bash结合使用时,键盘性能良好,但是当我使用sqlite shell(sqlite3程序)时,我的按键会发疯:

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

这是我的环境(相关部分):

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

我想像在Windows上一样,在sqlite上正常使用我的密钥。

我的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

Answers:


9

(仅供参考:这些是大多数终端上由这些键生成的常规序列,这取决于终端或程序/库来解释它们。您可以在工作的终端上按Ctrl+ v然后按End或其他非字符键来显示此序列,其中ctrl-V设置要按字面意义对待的下一个按键。)

似乎您的sqlite3二进制文件未使用readline,或者readline配置(inputrc)损坏(bash不过,如果工作正常,则可能性较小)。

您可能可以确认/拒绝是否将readline与以下内容which sqlite3一起使用,如果您的中没有使用readline,请替换为完整路径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,而不能获得全部功能,这就是为什么我们需要查看二进制文件。)

如果既不表示readline,ldd也不strings表示二进制文件不支持。

否则,请检查以下答案:在Ubuntu上具有readline支持的SQLite

如果您的sqlite3二进制文件中没有readline支持,则可以使用以下方法之一包装它:

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

两者都可以让您在命令行上指定历史记录文件。

您还可以检查您的bashreadline绑定,只是要确保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是“ meta”,等同于转义,因此在看到“ \M-” a“ \e”的地方也应该起作用。打印时,转义表示为^[(control- [)。


我添加了inputrc,如果您可以排除这种可能性的话
kurast 2013年

而我的sqlite编号未显示libreadline
kurast 2013年

1
然后,它可能没有领域支持,或者升级您的软件包(如果必须升级版本,请检查兼容性问题),或者rlwrap用作解决方法。答案已更新。
spuratic先生

我的二进制文件不是静态链接的,而且我的绑定输出也像您的一样。但是,我的安装中没有rlwrap或socat,也没有root用户权限来安装这些文件。
kurast
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.