바인딩의 alt-0과 같은 단축키에서 Bash 재설정이 작동하지 않는 이유
bind -x '"\e0":"reset"'
화면이 지워진 후(눈에 보이는 키 누름 에코 제공) 첫 번째 상단/시간에만 작동하고
보이지 않는 에코 키 누름으로 계속됩니다.
올바른 해결책이 있습니까?
답변1
너무 길어요.
bind -x '"\e0":reset; stty lnext "" discard "" -icrnl -icanon -echo'
분석하다
Kubuntu 22.04 LTS에서 테스트했습니다.
stty -a -F /dev/pts/X
다음은 Bash를 사용하여 대화형으로 읽을 때의 샘플 출력입니다 /dev/pts/X
.
speed 38400 baud; rows 21; columns 188; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = <undef>; discard = <undef>; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff
-iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
다음은 키 입력을 트리거한 후 stty -a -F /dev/pts/X
대화형 Bash가 읽은 샘플 출력 입니다./dev/pts/X
reset
speed 38400 baud; rows 21; columns 188; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
가장 중요한 것은 icanon
그것이 어디에 있어야 하는가이다 -icanon
. 이는 reset
키 누르기가 실행 되자마자 터미널이 표준 모드에 있음을 의미합니다 . 즉, Enter(또는 Ctrl+ j, Ctrl+ m; 또는 Ctrl+ )를 누를 d때까지 읽기 프로그램(여기서는 Bash)에 문자를 전달하지 않습니다 .
Alt표준 모드에서는 +를 누르면 (설정으로 인해 ) 0표시되지만 Bash는 나중에 읽기만 하고 반응합니다 . Bash는 또한 예상대로 설정을 변경하므로 나중에 +가 다시 작동합니다(그리고 다시 "중단").^[0
echo
EnterEnterAlt0
reset
Bash가 예상하는(및 부과하지만 키 입력이 트리거된 직후는 아닌 것으로 보이는) 설정 에는 -icanon
. 이 모드에서는 터미널 드라이버가 가로채지 않은 모든 키 입력이 즉시 Bash로 전달됩니다.
해결책
reset
키 입력을 실행하는 것뿐만 아니라 적어도 stty -icanon -echo
나중에 실행하여 문제를 해결할 수 있습니다 reset
. 위에 게시한 두 출력 사이에는 더 많은 차이점이 있습니다. 전체 수정 사항은 에 있습니다 stty lnext "" discard "" -icrnl -icanon -echo
. 따라서 바인딩은 다음과 같아야 합니다.
bind -x '"\e0":reset; stty lnext "" discard "" -icrnl -icanon -echo'