Bash 提示符加上颜色后导致历史命令残留的解决办法

陪她去流浪 桃子 2018年06月12日 编辑 阅读次数:2958

终端中 Bash Shell 的默认提示符是没有颜色的。

比如,在 macOS 上,BASH 的默认提示符 PS1 的值是:

1
2
$ echo $PS1
\h:\W \u\$

\h代表主机名,\W代表当前目录,\u代表当前用户。完整列表见man bashPROMPTING小节。 在我的笔记本上,输出的是:Taos-MacBook-Pro:posts tao$,木有颜色。

为了加入颜色,通常的做法是加入ANSI控制/转义字符,这样可以轻松地改变提示符的颜色。 比如,我在.bash_profile里面把PS1改成了如下(其中的 \033 也可以写作 \e\x1b):

1
export PS1="\033[31m\W \$\033[m "

这样做能正确地输出颜色。但是在按上/下键浏览历史记录时出现部分字符无法完全清除(残留)的情况,或者在输入命令时换行不正确的情况。 查阅BASH手册及相关Google得知,需要将不可显示的字符包含在一对\[\]之中(这里的\不是转义字符,是需要作为常量字符输入的),否则BASH会错误计算命令的长度。 比如我的应该改成:

1
export PS1="\\[\033[31m\\]\W \$\\[\033[m\\] "

注意:由于BASH把\作为转义字符,所以为了得到\[\]应该输入\\[\\]

具体原因不是很清楚,可以参考以下链接:

标签:Bash