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

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

我打开一个 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/9ttys之间的通信时,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)。

相关内容