Bash 的命令提示符

一直在使用很久前从 archwiki 抄过来的命令提示符:

PS1="$sq_color\342\224\214\342\224\200\$([[ \$? != 0 ]] && echo -e \"[\033[1;37m\342\226\210$sq_color]\342\224\200\")$sq_color[\033[1;37m\t$sq_color]\342\224\200[\033[1;37m\[email protected]\h$sq_color]\n$sq_color\342\224\224\342\224\200\342\224\200> \033[1;37m\W$sq_color $ \033[1;37m>>\033[0m "

但这个命令提示符在遇到长命令后,在历史记录的上下滚动中会产生显示问题:

执行#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh后按C-pC-n:

┌─[18:18:08]─[[email protected]]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
┌─[18:18:23]─[[email protected]]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

C-p:

┌─[18:18:08]─[[email protected]]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
┌─[18:18:23]─[[email protected]]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

这个命令提示符哪里出了问题? 我把些字符用 vt100 的 escape 键来表示,但也不行。

你这太复杂了,一眼望不到头。分解成多项比较好理解,也利于排错。

我之前遇到 echo 导致的错误(具体什么现象忘记了),后来改为 printf 解决。我用的是 macOS 系统。

把字符改成 ascii 字符,短了点,错误依旧:

PS1="$sq_color|-\$([[ \$? != 0 ]] && echo -e \"[\033[1;37mO$sq_color]\342\224\200\")$sq_color[\033[1;37m\t$sq_color]-[\033[1;37m\[email protected]\h$sq_color]\n$sq_color|--> \033[1;37m\W$sq_color $ \033[1;37m>>\033[0m "

echo -e 改成printf错误依旧。

我怀疑在我这里,PS1 不能有 esacpe,因为下面的 PS1 也有这问题:

PS1="\033[0m\[email protected]\h \W $"

\W 后面应该是 \$ 吧?

改成\$没用。。。

PS1 后面的 \033[0m 是色彩吗?好像不完整,应该是对称的一组数字,例如:

$ echo -e "\033[0;31m 红色 \033[0m"

各种颜色值: https://gist.github.com/vratiu/9780109

我注意到他的颜色都包在了\[\]里面,我就改成了这样,成功了,但不确定是不是所有的 escape 都这样。。。

我用 NetBSD + ksh93 + vt100 时,所有 escape 都没包在\[\]里,没这问题,不知道这特性是不是 bash 特有的。

我在 ~/.bash_prompt 文件里也是有 \[ \] 包裹的,直接命令行打印演示则应去掉,否则\[\] 会原样输出。

我又发现了新的问题,这个问题只会在ansi-termterm中出现,同时如果把它们的TERM改成dumb-emacs-ansi的话也没问题。

这个问题就是上下选择命令历史记录时(选择方法见主楼,多C-pC-n几次),遇到较长命令,命令提示符的>>会消失。

基于之前的经验,我怀疑是 escape 的问题,就用如下删除了颜色,不过问题还是会出现。

export PS1=$(echo $PS1 | sed -e 's/1;37/0;37/g' | sed -e 's/0;//g' | sed -e 's/\\\[\\033\[[0-9]\+m\\\]//g')' '

删除颜色后的PS1

\342\224\214\342\224\200$([[ $? != 0 ]] && echo -e "[\342\226\210]\342\224\200")[\t]\342\224\200[\[email protected]\h]\n\342\224\224\342\224\200\342\224\200> \W $ >>