我已将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
。