Linuxでsqliteシェルを使用すると奇妙なキーボード


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

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

回答:


9

(FYI:これらは、ほとんどの端末でこれらのキーによって生成される通常のシーケンスであり、それらを解釈するのは端末またはプログラム/ライブラリ次第です。Ctrl+ vを押してから、Endまたはその他の非文字キーを押すことにより、これを作業端末で表示できます。ctrl-Vは、次のキープレスが文字どおりに処理されるように設定します。)

あなたのように思えるsqlite3のバイナリが使用されていないreadline、またはreadlineの構成は(inputrc(可能性が低い場合)壊れてbashOKかかわらを働いています)。

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、機能の完全なセットは取得できません。そのため、バイナリを使用する必要があります。)

readline もどちらlddstrings示さない場合、バイナリがサポートしていないことはほぼ確実です。

それ以外の場合は、この回答を確認してください: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」であり、escapeと同じであるため、「\M-」が表示されている場所でも機能する\eはずです。印刷すると、エスケープ^[(control- [)として表されます。


この可能性を排除するために検討していただければ、私はinputrcを追加しました
クラスト

sqliteのlddにlibreadlineが表示されない
kurast

1
おそらくそれはrealdineサポートを持たないでしょう。パッケージをアップグレードする(バージョンをアップグレードする必要がある場合は互換性の問題を確認する)かrlwrap、回避策として使用してください。回答を更新しました。
mr.spuratic 2013年

私のバイナリは静的にリンクされていません。また、私のバインド出力はあなたのものです。ただし、私はインストールにrlwrapもsocatも持っておらず、それらをインストールするためのrootアクセス権も持っていません。
kurast 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.