user536152 Asked: 2022-09-18 06:19:52 +0800 CST2022-09-18 06:19:52 +0800 CST 2022-09-18 06:19:52 +0800 CST 如何通过绑定在快捷方式中重置 Bash 不起作用 772 为什么 Bash 在快捷方式中重置,例如绑定中的 alt-0 不起作用 bind -x '"\e0":"reset"' 它仅在屏幕清除后的第一个顶部/时间才起作用(给出可见的按键回声), 然后继续保持不可见的回声击键 有什么正确的解决办法吗? bash bind 1 个回答 Voted Best Answer Kamil Maciorowski 2022-09-18T07:51:22+08:002022-09-18T07:51:22+08:00 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/Xreset 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'
tl;博士
分析
我在 Kubuntu 22.04 LTS 中测试过。
stty -a -F /dev/pts/X
这是交互式 Bash 从以下内容读取时的示例输出/dev/pts/X
:这是一个交互式 Bash在您的击键触发后
stty -a -F /dev/pts/X
读取的示例输出:/dev/pts/X
reset
最重要的是
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
. 所以绑定应该是: