所有或大多数 Linux 终端都有一个奇怪的行为,这困扰了我很长时间。我不确定这是一个错误还是有意为之,或者是配置问题。所以我先在这里问一下。
重现步骤
- 打开终端。
- 可选:运行
export PS1='~ \$'
, 来标准化此设置。请随意尝试此设置。 - 跑步
echo -n hello
。 - 使用“向上”键获取上一个命令。
- 使用“向下”箭头键返回到空提示。
- 再次使用“向上”。
预期的
(这是我自己的 $PS1 留下的~ $
。)
运行后echo -n hello
:
~ $ echo -n hello
hello~ $
“向上”箭头键后:
~ $ echo -n hello
hello~ $ echo -n hello
“向下”箭头键后:
~ $ echo -n hello
hello~ $
第二个“向上”箭头键后:
~ $ echo -n hello
hello~ $ echo -n hello
实际的
(这是我自己的 $PS1 留下的~ $
。)(前两个步骤如“预期”中所示)
“向下”箭头键后:
~ $ echo -n hello
hell
第二个“向上”箭头键后:
~ $ echo -n hello
hellecho -n hello
变化
- 使用不同的 $PS1 值。
- 在 echo 中使用不同长度的字符串。
- 追溯历史。对我来说,某些历史价值观的影响与其他价值观不同。
我的终端
我在用
Konsole 版本 21.12.3
但我想我过去也在其他终端上看到过这种情况。我不知道 KDE“Konsole”是否对这种行为负责。
附加信息
(回应下面的评论)
确实如此不是发生在用户“root”身上!
最初我看到了我自己的用户和用户之间的区别root
。但事实证明,这只是由于$PS1
设置的差异造成的。将此值标准化为'~ \$'
, 或 后'${debian_chroot:+($debian_chroot)}\[\033[01;34m\]\w\[\033[00m\] \$ '
,我现在看到 root 和我自己有相同的行为。
它也发生在 docker 容器内的 bash 中,该容器具有完全独立的设置。
链接
作为记录,我在这里开了一个问题,https://bugs.kde.org/show_bug.cgi?id=464384
答案1
这只是 bash (实际上是 readline)认为提示符从当前行的最左边位置开始,然后当您按下 Down 时,只是移动到位置 5,并清除到行尾。
当您按下向下键时,bash 会将以下内容发送到终端:
\r\33[C\33[C\33[C\33[C\33[K
这是一个回车符移动到当前行的最左边位置,四个(提示符的长度)CUF(光标前进)控制序列和一个 EL(擦除行)控制序列,参数 0(默认)清除从当前光标位置到行尾。