Bash 提示符加上颜色后导致历史命令残留的解决办法
终端中 Bash Shell 的默认提示符是没有颜色的。
比如,在 macOS 上,BASH 的默认提示符 PS1
的值是:
1 2 |
|
\h
代表主机名,\W
代表当前目录,\u
代表当前用户。完整列表见man bash
的PROMPTING
小节。
在我的笔记本上,输出的是:Taos-MacBook-Pro:posts tao$
,木有颜色。
为了加入颜色,通常的做法是加入ANSI控制/转义字符,这样可以轻松地改变提示符的颜色。
比如,我在.bash_profile
里面把PS1
改成了如下(其中的 \033
也可以写作 \e
或 \x1b
):
1
|
|
这样做能正确地输出颜色。但是在按上/下键浏览历史记录时出现部分字符无法完全清除(残留)的情况,或者在输入命令时换行不正确的情况。
查阅BASH手册及相关Google得知,需要将不可显示的字符包含在一对\[\]
之中(这里的\
不是转义字符,是需要作为常量字符输入的),否则BASH会错误计算命令的长度。
比如我的应该改成:
1
|
|
注意:由于BASH把\
作为转义字符,所以为了得到\[\]
应该输入\\[\\]
。
具体原因不是很清楚,可以参考以下链接: