为什么这个 PS1 值会导致意外行为?

为什么这个 PS1 值会导致意外行为?

可能的重复:
为什么当我浏览历史记录时,我的 bash 提示符会出现问题?

我已将PS1变量设置.bashrc为以下内容:

PS1='\e[35m[\W]:\e[0m '

cwd它实现了它的预期目的(更改内部[]和之前显示的提示的颜色:),但是当我搜索命令历史记录时,有时我循环的部分命令会附加到提示上。例如:

[~]: echo "something"
something
[~]: date
Sun Nov 18 17:07:54 PST 2012
[~]: sudo apt-get install vim
...

现在,假设我想返回我的echo "something"命令,我按下并得到

[~]: sudo apt-get install vim

我再次按下,然后发生这种情况

[~]: sudo apt-date

再次起来

[~]: sudo apt-echo "something"

如果我通过按退格键删除命令行上的所有内容,它会一直删除到

[~]: sudo apt-

对命令没有影响。例如,该行[~]: sudo apt-date仍会打印date等的输出。为什么会发生这种情况以及如何在没有副作用的情况下实现所需的提示?

答案1

发生的事情是 Bash 对提示中的打印字符数感到困惑。它将光标定位序列发送到终端,以正确定位光标以执行命令历史记录等。在打印提示后,它需要清楚地了解光标的实际位置。

尝试将提示设置为:

PS1='\[\e[35m\][\W]:\[\e[0m\] '

现在它应该按预期工作。

\[和对\]告诉 Bash 它们之间的内容是非打印转义序列,并且实际上不会向前移动光标。然后,它会正确猜测光标位置,并在浏览命令历史记录时进行正确的替换。

该信息可以在信息节点中找到(bash)Printing a Prompt

编辑:在较新版本的 bash 中,这已更改为(bash)Controlling the Prompt

相关内容