为什么在滚动历史记录时,此bash提示有时会保留以前的命令的一部分?


29

我承认,我的bash提示是从几个地方偷来的,凑在一起,当使用向上/向下箭头滚动bash历史记录时,有时会在其长度上添加以前命令的一部分。

例如,如果我以前的命令是:

ls
cd /home/caleb
vim .bashrc

当我出现提示并向上滚动两次时,它可能类似于:

$ vim .bcd / home / caleb

最后一个命令剩下的前五个字符。

有谁知道为什么会这样,如何阻止它?

我的提示设置了以下代码(很长的地方要包含在此处):https : //gist.github.com/1679352


1
将PS1设置为一个没有整个vcs废话的值,然后看看会发生什么。那是我的猜测。
丹尼尔·贝克

您是否已在提示中找到罪魁祸首?我有同样的问题。
acme 2014年

是的bash会在颜色上丢失它,并且无法将带有颜色转义符的字符串的长度与可见字符串的长度分开。这就是SiegeX的目的。我最终切换到ZSH并使用其他提示。ZSH没有相同的问题。
卡莱布·汤普森

1
先前的两个答案都没有解决我的问题,也没有给出任何解释为什么会发生这种情况。如果有人搜索到这一点,请检查“ 自定义Bash”提示是否正在覆盖自身
D3Hunter 2014年

Answers:


6

您的提示出现在某处。通常会发生的情况是,您的shell认为其输出不可打印的条款代码并期望占用空间。我可以给您的最佳建议是系统地添加(或取消)您的提示,直到此行为停止以隔离导致此问题的代码。


37

颜色代码需要用方括号括起来。方括号告知bash不应打印随附的文本

以@Phreditor的示例为基础,这表明在换行符之后进行的任何格式化都会导致原始问题:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

将格式代码包装在[]中可确保避免发生烦人的行为:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

文档:http//tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

由于PS1格式化会导致该值太长且难以读取,因此我将格式代码放入变量中:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
这应该是公认的答案。确实解决了问题。
Atcold

1
应该指出的是(因为我没注意到;)),在那堆反斜杠和方括号中,转义符后面的方括号\033不能被转义。只有包装方括号会被转义。
杰姆'18

使用第一个Google结果,让我感到困惑的是,我无法处理所有这些特殊字符:ezprompt.net
Mallox

我一直想自定义YEARS的提示颜色,但是从来没有,因为我一直遇到这个问题!我永远无法弄清楚为什么,所以我停下来把所有东西都弄白了……我只是在设置一台新计算机,它终于让我想到一次真正地将这个问题搜索到谷歌……真高兴!感谢您的精彩教训。
TylerH4

8

我有同样的问题,它与颜色定义有关。

就我而言,我有一个多行提示符(不管提示符显示的路径长度如何,都会为当前命令留出大部分空间)。

错误版本:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

好版本:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00m终止颜色。如果它在换行符(\n)之后,则会阻止在终端中进行正确的重绘,从而用背景色覆盖以前的命令。将其移到新行的后面即可解决问题。

(在Mac OS 10.8中使用终端)


这对于我来说是个问题,而当前接受的答案太笼统了。
布赖恩

这是更精确的答案,应该是赢家(也是我的问题的解决方案)。
craveytrain 2015年

\n也是我的罪魁祸首。谢谢!
mhulse

3

我实际上认为这与缺少的“非打印字符”定界符有关。我遇到了完全相同的问题,但是将其移到换行符(\ 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,则可能确实如此-您必须进行测试。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.