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

sta*_*z77 16 bash prompt command-history

可能重复:
为什么浏览历史记录时我的 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
...
Run Code Online (Sandbox Code Playgroud)

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

[~]: sudo apt-get install vim
Run Code Online (Sandbox Code Playgroud)

我再次按下,这发生了

[~]: sudo apt-date
Run Code Online (Sandbox Code Playgroud)

再起来

[~]: sudo apt-echo "something"
Run Code Online (Sandbox Code Playgroud)

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

[~]: sudo apt-
Run Code Online (Sandbox Code Playgroud)

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

Omn*_*ous 26

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

尝试将您的提示设置为:

PS1='\[\e[35m\][\W]:\[\e[0m\] '
Run Code Online (Sandbox Code Playgroud)

它现在应该按预期工作。

\[\]对告诉猛砸它们之间的东西是一个非打印转义序列,也不会真正向前移动光标。然后它会正确猜测光标位置并在浏览命令历史时进行适当的替换。

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

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

  • @stariz77,不,[info (aka Texinfo)](http://www.gnu.org/software/texinfo/) 是 GNU 项目的标准文档格式。它通常包含比联机帮助页更多的详细信息。尝试输入命令`info bash`(或`info info` 以了解`info` 本身)。 (2认同)