bash(tty 및 X)에서 긴 입력 문자열을 사용하면 홈 키가 이상하게 동작합니다.

bash(tty 및 X)에서 긴 입력 문자열을 사용하면 홈 키가 이상하게 동작합니다.

Home현재 입력이 충분히 짧은지(예: <36자) 클릭하면 정상적으로 작동합니다. 그런데 긴 명령어를 입력한 후 다시 처음으로 돌아가려고 하면 작업이 완료된 것 같은데 명령어가 실행되지 않습니다.보여주기 위해옳은. 처음에는 아니고 10자 정도 뒤에 있는 것 같네요. "맹목적으로" 입력하면 잘 작동하지만 전체 입력이 오른쪽으로 이동했지만 다시 그려지지 않은 것처럼 완전히 엉망인 것처럼 보입니다. 그래서 덮어쓰려고 입력했지만 "실제로는" 그렇지 않았습니다. 왜냐하면 제가 "제거한" 부분이 "실제로는" 오른쪽 10자였기 때문입니다. 따라서 명령을 삭제하려고 하면 처음 10자가 계속 표시되지만, 클릭하면 Enter이전 입력이 비어 있는 것처럼 또 다른 프롬프트가 표시됩니다.

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

나는 이것을 tty와 X 세션이 있는 터미널에서 재현했습니다. Ctrl+를 클릭 V하면 다른 시퀀스( X, tty) Home가 표시되지만 둘 다 내 시퀀스인 것 같습니다 .^[OH^[[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 $TERMlinuxtty 및 xtermX 세션 에 나타납니다 .

그것은

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

누구든지 이것에 대한 단서를 가지고 있습니까?

답변1

프롬프트의 인쇄되지 않는 부분(색상 변경에 사용되는 이스케이프 시퀀스를 포함하되 이에 국한되지 않음)을 및 로 묶어야 합니다 \[.\]

원래 팁: \e[0;36m[\u@\h \W]\$ \e[m
수정 팁:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

그리고 그 사이의 모든 내용은 실제로 화면에 인쇄되지 않는다는 것을 \[알려줍니다 \]. bash즉, 길이가 0입니다. 입력한 문자를 어디에서 에코할지 알기 위해서는 계산된 프롬프트 길이가 필요합니다. \[ \]이를 무시하면 bash프롬프트 길이가 잘못 계산되어 bash커서가 현실과 일치하지 않는다는 생각 때문에 이상한 터미널 형상에 따른 동작이 발생하는 경우가 많습니다.

관련 정보