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

use*_*271 15 bash terminal-emulator

我打开一个 xterm 终端(80 列 x 24 行),然后运行$ bash --norc --noprofile,然后$ tty获取终端的文件名:输出是/dev/pts/9.

我从另一个终端运行:

$ printf foo >/dev/pts/9
Run Code Online (Sandbox Code Playgroud)

foo打印在第一个终端的 shell 命令行上。
如果我按下C-u运行unix-line-discard(由 给出的函数名称$ bind -P | grep -i c-u),foo则不会被删除。
如果我插入 11 个空格并按C-u,空格会被删除,但不会被删除foo
如果我插入 12 个空格并按C-u,空格也会被删除foo

在此处输入图片说明

为什么fooC-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)
Run Code Online (Sandbox Code Playgroud)

ImH*_*ere 20

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

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

bash-4.3$ printf 'some text'
Run Code Online (Sandbox Code Playgroud)

要得到:

some textbash-4.3$
Run Code Online (Sandbox Code Playgroud)

在这一点上退格不会删除任何东西。也ctrl-u不会擦除任何东西。如果您键入一些字符(最多 11 个),ctrl-u将仅删除键入的内容(退格也是如此)。但是当超过 11 个字符时,该命令ctrl-u将返回到它认为的行首(一种擦除许多字符的更快方法),这将留下以下提示:

some textb
Run Code Online (Sandbox Code Playgroud)

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