为什么这个两行 bash 提示会打乱命令历史记录

Why this two-line bash prompt is messing up the command history

我的 bash 提示为:

\u@\H: \w$(__git_ps1 "[\[\e[0;32m\]%s\[\e[0m\]\[\e[0;33m\]$(parse_git_dirty)\[\e[0m\]]")\n\e[1m\t\e[0m $

所以第二行是显示当前时间

然而,我发现它弄乱了历史 - 当使用箭头键向上移动时,命令端口似乎得到 "stuck" 并且不会再改变它。我返回的唯一方法是再次按 Enter。如何解决?

\u@\H: \w$(__git_ps1 "[\[\e[0;32m\]%s\[\e[0m\]\[\e[0;33m\]$(parse_git_dirty)\[\e[0m\]]")\n\e[1m\t\e[0m $
#                                                                                         ^^^^^  ^^^^^

第一行的所有 ANSI 转义序列都被 \[\] 正确包围,这告诉 Bash 在计算视觉长度时不要计算这些字符的提示。第二行缺少这些分隔符。

PS1='\u@\H: \w$(__git_ps1 "[\[\e[0;32m\]%s\[\e[0m\]\[\e[0;33m\]$(parse_git_dirty)\[\e[0m\]]")\n\[\e[1m\]\t\[\e[0m\] $'
#                                                                                              ^^     ^^  ^^     ^^