为什么这个两行 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\] $'
# ^^ ^^ ^^ ^^
我的 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\] $'
# ^^ ^^ ^^ ^^