为什么需要插入12个字符来清除此bash命令行?


14

我打开一个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)

Answers:


19

当其他程序打印foo/dev/pts/9ttys之间的通信时,shell不参与交换,它无法知道打印了多少个字符,甚至没有打印任何字符。Shell仍然认为没有要删除的字符。实际上,如果您打印foo到终端并尝试使用退格键将其擦除,则无法使用。外壳程序不会尝试擦除它认为不存在的内容。

在使用--norc --noprofile命令的终端中尝试:

bash-4.3$ printf 'some text'

要得到:

some textbash-4.3$

到那时,退格将不会删除任何内容。而且,ctrl-u不会擦除任何东西。如果键入某些字符(最多11个),则ctrl-u只会删除键入的字符(如退格键)。但是,当字符数超过11个时,该命令ctrl-u将返回到它认为的行首位置(一种擦除许多字符的更快方法),这将显示以下提示:

some textb

可以将其视为IMO错误(仍在bash 5.0中存在)。但是如果--norc --noprofile不使用选项,则将bash-5中的字符更改为20(对于OP为18)(我没有尝试找出原因,不是IMnshO这样重要的问题)。


谢谢你的回答。关于第二个错误,如果使用$ printf 'some text',我可以在bash 5.0上重现,而无需--norc --noprofile插入17个字符或更多。
user938271

@ user938271正确,此问题以20个字符为我重现,信息已添加到答案中,谢谢。
艾萨克(Isaac)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.