web-dev-qa-db-ja.com

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

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

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
kurast

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

sqlite3バイナリがreadlineを使用していないか、readline構成(inputrc)が壊れているようです(ただし、bashが正常に機能している場合は可能性が低くなります)。

Readlineが次のように使用されているかどうかを確認/拒否できる場合があります。PATHにない場合は、which sqlite3をフルパスに置き換えてください。

ldd `which sqlite3` 

libreadline.soなどが表示された場合は、動作するはずですので、INPUTRC環境変数、~/.inputrcおよび/etc/inputrcを確認してください。静的にリンクされている(libreadline.aslimの可能性があります。

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

文字列INPUTRC~/.inputrc、または/etc/inputrcが存在する場合、readlineが静的にリンクされているように見え、機能するはずです。

(せいぜい、pragma compile_optionsからいくつかの基本バージョンとコンパイル情報(サポートされている場合はsqlite3)しか取得できませんが、機能の完全なセットは取得できません。そのため、バイナリを調べてみる必要があります。)

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

それ以外の場合は、この回答を確認してください: buntuでreadlineをサポートするSQLite

sqlite3バイナリでreadlineサポートがない場合は、次のいずれかを使用してwrapできます。

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

どちらの場合も、コマンドラインで履歴ファイルを指定できます。

bash readlineバインディングをチェックして、readlineが期待どおりに機能し、構成されていることを確認することもできます。

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

私のシステム(rxvt内でbash-3.xを実行)では、次のようになります。

"\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」も機能するはずです。印刷されると、escape^[(control- [)として表されます。

9
mr.spuratic