我打开一个 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
按下无法删除,为什么需要插入 12 个字符才能删除?C-u
环境:
$ 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)
答案1
当其他程序打印foo
到/dev/pts/9
ttys之间的通信时,shell不参与交换,它无法知道打印了多少个字符,甚至不知道是否打印了任何字符。 shell 仍然认为没有要删除的字符。事实上,如果您打印foo
到终端并尝试用退格键删除它,这是行不通的。 shell 不会尝试删除它认为不存在的内容。
在使用 --norc --noprofile 命令的终端中尝试:
bash-4.3$ printf 'some text'
要得到:
some textbash-4.3$
此时退格键不会删除任何内容。也ctrl-u
不会删除任何东西。如果您输入一些字符(最多 11 个),ctrl-u
将仅删除输入的内容(退格键也是如此)。但是,当字符超过 11 个时,该命令ctrl-u
将返回到它认为是行开头的位置(擦除许多字符的更快方法),这将留下此提示:
some textb
在我看来,这可以被认为是一个错误(在 bash 5.0 中仍然存在)。但是如果未使用选项,则在 bash-5 中更改为 20 个(OP 为 18 个)字符--norc
--noprofile
(我没有尝试查找原因,不是一个重要的问题 IMnshO)。