리눅스에서 sqlite shell을 사용할 때 이상한 키보드


9

나는 여물통 퍼티에 연결된 리눅스 박스를 사용한다. bash와 함께 사용하면 키보드가 잘 작동하지만 sqlite shell (sqlite3 프로그램)을 사용하면 키가 열광합니다.

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

여기 내 env (관련 부분)가 있습니다 :

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

창문에서와 같이 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(덜 경우) 고장 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있지만 ( 지원되는 경우) 전체 기능을 사용할 수는 없으므로 바이너리에서 파킹해야합니다.)

readline을 나타내 ldd거나 strings나타내지 않으면 바이너리가 지원하지 않는 것이 확실합니다.

그렇지 않으면이 답변을 확인하십시오 : 우분투에서 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-"a " \e"가 표시되는 위치도 작동합니다. 인쇄되면 이스케이프^[(control- [) 로 표시됩니다 .


이 가능성을 배제 할 수 있다면 inputrc를 추가했습니다
kurast

sqlite의 내 ldd는 libreadline을 보여주지 않습니다
kurast

1
그것은 아마 다음 realdine 지원을, 중 (당신이 버전을 업그레이드해야하는 경우 체크 호환성 문제) 패키지를 업그레이드하거나 사용하지 않는 rlwrap해결있다. 답변이 업데이트되었습니다.
mr.spuratic

내 바이너리는 정적으로 연결되어 있지 않으며 바인드 출력은 당신과 같습니다. 그러나 설치에 rlwrap 또는 socat이 없으며 설치를위한 루트 액세스 권한이 없습니다.
kurast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.