Bash

如何通過綁定在快捷方式中重置 Bash 不起作用

  • September 18, 2022

為什麼 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. After EnterBash 還會將設置更改為預期的設置,因此稍後您的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'

引用自:https://unix.stackexchange.com/questions/717643