我实际上认为这与缺少的“非打印字符”定界符有关。我遇到了完全相同的问题,但是将其移到换行符(\ n)之前无法解决。相反,我正确地用'\ ['和'\]'包围了所有非打印字符(此处为着色命令)。
不好(可以,但是存在上述的历史记录合并问题):
PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"
良好(将所有颜色命令都用'\ ['和'\]'包围-不显示混搭的命令历史记录):
PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"
i.e. "\e[...m" --becomes--> "\[\e[...m\]"
并且,如果您将其放入SecureCRT之类以在登录系统时自动发送,则如果自动登录系统使用了第一个反斜杠本身来确定要发送的字符,则可能必须对所有内容进行两次转义(将双反斜杠置于各处)。 :
PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"
i.e. "\..." --becomes--> "\\..."
(对于SecureCRT,这绝对是正确的;对于其他产品,例如PuTTY或TeraTerm,则可能确实如此-您必须进行测试。)