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

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

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

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

ls
cd /home/caleb
vim .bashrc

当我按照提示向上滚动两次时,它可能看起来像:

$ vim .bcd /home/caleb

其中前五个字符是上一条命令剩下的。

有人知道为什么会发生这种情况,以及如何阻止它吗?

我的提示是使用此代码设置的(太长了,无法在此处包含):https://gist.github.com/1679352

答案1

您的提示符在某个地方出了问题。通常发生的情况是,您的 shell 认为它输出的是不可打印的术语代码,并期望它占用空间。我能给您的最佳建议是系统地添加(或删除)您的提示符,直到此行为停止,以隔离导致此问题的代码。

答案2

颜色代码需要用方括号括起来。方括号通知 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

我遇到了同样的问题,这与颜色定义有关。

就我而言,我有一个多行提示(无论提示显示的路径长度如何,都为当前命令提供大部分空间)。

错误版本:

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 中的终端)

答案4

我遇到了这个问题。我发现了什么?

当 PS1 变量内部有颜色时(例如:“\e[35m”),它总是必须被“\[”和“\]”包围(例如:“\[\e[35m\]”)。

当我按照这个规则标记 PS1 中的所有颜色时,它成功了!

滚动 bash 历史记录不再存在问题。

不好的例子:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; 导出 PS1

好例子:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e[0m\] "; 导出 PS1

相关内容