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
。
为什么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)
Run Code Online (Sandbox Code Playgroud)
ImH*_*ere 20
当某些其他程序打印foo
到/dev/pts/9
tty 之间的通信时,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)。