我打开一个 xterm 终端(80 列 x 24 行),然后运行$ bash --norc --noprofile
,然后$ tty
获取终端的文件名:输出为/dev/pts/9
.
从另一个终端我运行:
$ printf foo >/dev/pts/9
foo
打印在第一个终端的 shell 命令行上。
如果我按下C-u
运行unix-line-discard
(由 给出的函数名称$ bind -P | grep -i c-u
),foo
则不会被删除。
如果我插入 11 个空格并按C-u
,则空格会被删除,但不会foo
。
如果我插入 12 个空格并按C-u
,则空格也会被删除foo
。
foo
为什么当我的光标在它后面时我按下时不能删除C-u
,为什么我需要插入12个字符才能删除它?
环境:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
$ bash --version | head -n1
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
$ xterm -version
XTerm(322)
当其他一些程序打印
foo
到/dev/pts/9
ttys 之间的通信时,shell 不参与交换,它无法知道打印了多少字符,甚至打印了任何字符。shell 仍然相信没有要擦除的字符。实际上,如果您打印foo
到终端并尝试使用退格键将其擦除,则它不起作用。shell 不会试图抹去它认为不存在的东西。在您使用 --norc --noprofile 命令的终端中尝试:
要得到:
此时退格键不会删除任何内容。也
ctrl-u
不会删除任何东西。如果您输入一些字符(最多 11 个),ctrl-u
则只会删除输入的内容(退格键也是如此)。但是,当字符数超过 11 个时,该命令ctrl-u
将返回到它认为的行首(擦除许多字符的更快方法),这将留下以下提示:这可以被认为是 IMO 的一个错误(仍然存在于 bash 5.0 中)。但是如果不使用选项,则在 bash-5 中更改为 20 个(对于 OP 为 18 个)字符
--norc
--noprofile
(我没有尝试找到原因,不是 IMnshO 这么重要的问题)。