Bash
如何通過綁定在快捷方式中重置 Bash 不起作用
為什麼 Bash 在快捷方式中重置,例如綁定中的 alt-0 不起作用
bind -x '"\e0":"reset"'
它僅在螢幕清除後的第一個頂部/時間才起作用(給出可見的按鍵迴聲),
然後繼續保持不可見的迴聲擊鍵
有什麼正確的解決辦法嗎?
tl;博士
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
這是一個互動式 Bash在您的擊鍵觸發後
stty -a -F /dev/pts/X
讀取的範例輸出:/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
在按鍵觸發後終端處於規範模式,即它不會將字元傳遞給閱讀程序(這裡:Bash),直到您按下Enter
(或Ctrl
+j
,或Ctrl
+m
; 或Ctrl
+d
)。在規範模式下,您可以按
Alt
+0
並且您會看到^[0
(由於echo
設置),但 Bash 只會在Enter
. AfterEnter
Bash 還會將設置更改為預期的設置,因此稍後您的Alt
+0
將再次起作用(並再次“中斷”)。Bash 期望的設置(並強加,但顯然不是
reset
在擊鍵觸發後直接)包括-icanon
. 在這種模式下,終端驅動程序未攔截的每個擊鍵都會立即傳遞給 Bash。解決方案
您可以通過使擊鍵不僅執行
reset
,而且至少stty -icanon -echo
在之後執行來解決問題reset
。我在上面發布的兩個輸出之間存在更多差異;完整的修復在stty lnext "" discard "" -icrnl -icanon -echo
. 所以綁定應該是:bind -x '"\e0":reset; stty lnext "" discard "" -icrnl -icanon -echo'