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

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

我使用通过 putty 连接的 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

我希望在 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

答案1

(仅供参考:这些是大多数终端上这些键生成的正常序列,由终端或程序/库来解释它们。您可以在工作终端上按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,那么几乎可以肯定二进制文件不支持。

否则检查这个答案:Ubuntu 上支持 readline 的 SQLite

如果你的二进制文件不支持 readline,sqlite3你可以它使用以下之一:

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-“ ”。打印时,\e逃脱表示为^[(control-[)。

相关内容