긴 입력 문자열에서 bash (tty 및 X)에서 이상하게 작동하는 홈 키


11

Home현재 입력이 충분히 짧으면 (예 : <36 자) 적중 하면 제대로 작동합니다. 그러나 더 긴 명령을 입력 한 다음 처음으로 돌아가고 싶을 때 명령이 제대로 작동하지만 더 이상 명령이 표시 되지 않습니다. 마치 처음에는 없지만 10 자 정도 떨어져있는 것처럼 보입니다. "맹목적으로"입력하면 제대로 작동하지만 전체 입력이 오른쪽으로 이동하지만 다시 그려지지 않는 것처럼 전체 혼란처럼 보입니다. 그래서 제가 "지우고있는"장소가 오른쪽에 "실제로"10 문자가 있기 때문에 나는 그것을 입력하지만 "사실"은 아닙니다. 따라서 명령을 지우려고하면 처음 10자가 계속 표시되지만 히트 Enter하면 이전 입력이 비어있는 것처럼 다른 프롬프트가 표시됩니다.

나는 그것이 최고의 설명이 아니라는 것을 알고 있지만 요점은 배쉬가 그것을 인식하고 올바른 일을하려고하지만 종종 실패한다는 것입니다.

나는 이것을 tty와 X 세션의 터미널에서 모두 재현합니다. 내가 공격 할 때 Ctrl+를 V하고 Home나는 (다른 시퀀스를 참조 ^[OH, X에서 ^[[1~청각 장애에)하지만, 모두가 내에있을 것 같다 /etc/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

$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[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": 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

echo $TERMlinux청각 장애와 xtermX 세션한다.

이것의

GNU bash, 버전 4.2.24 (2)-릴리스 (i686-pc-linux-gnu)

아무도 이것에 대한 단서가 있습니까?


1
프롬프트가 얼마나 걸립니까? 약 36 자 길이의 명령 행을 입력하면 터미널의 한 줄이 채워 져서 측면 스크롤이 발생합니까? 이 프롬프트를 사용하면 여전히 발생합니까? PS1='$ '
Mikel

@Mikel 나는 당신이 무엇을 생각하는지 모르지만, 아마도 당신은 아마도 올바른 길을 가고 있습니다. 최소한의 프롬프트를 사용하면 발생하지 않는 것 같습니다. 내가 사용한 것은 기본 것과 비교하여 약간 수정되었습니다 PS1="\e[0;36m[\u@\h \W]\$ \e[m". 잘못된 생각이 있습니까? 36자를 입력해도 한 줄은 채워지지 않습니다. 또한, 나는 tty에서 측면 스크롤이 없습니다 :)
Lev Levitsky

@Mikel 나는 jw013의 조언을 따르고 프롬프트를 조정했습니다. 어쩌면 당신은 문제가 무엇인지에 대해 자세히 설명 할 수있을 것입니다. 그래서 나는 먼저 그것을 알아낼 수있는 담당자로서 당신에게 보상 할 수 있습니다. :)
Lev Levitsky

답변:


13

당신은과 (색상 변경에 대한 이스케이프 시퀀스에 제한을 포함하지만) 프롬프트의 비 인쇄 부분을 둘러싸 필요 \[하고 \].

원래 프롬프트 : \e[0;36m[\u@\h \W]\$ \e[m
고정 프롬프트 :\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

\[\]말해 bash실제로 화면에 인쇄되지 않는 사이에 그 모든 것을, 즉 길이가 제로. 입력 한 문자를 에코 할 위치를 알기 위해서는 계산 된 프롬프트 길이가 필요합니다. 제외 \[ \]하면 bash잘못된 프롬프트 길이가 계산 bash되어 커서가 실제 위치와 일치하지 않는 위치 로 인해 이상한 터미널 구조에 따라 동작하는 경우가 종종 있습니다.


고마워, 이것은 문제를 해결합니다. 그래도 나는 그 행동의 이유가 무엇인지, 대괄호가하는 일 등을 설명 할 것입니다. 한 페이지에 모두 넣는 것이 좋으며 앞으로 다른 사람을 도울 수 있습니다.
Lev Levitsky 2016 년

@ LevLevitsky 대답에 간단한 설명을 추가했습니다.
jw013

감사합니다! 이제 더 이해가 되네요.
Lev Levitsky 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.