带有颜色的 bash 提示的奇怪包装(使用了 `\[` 和 `\]`)

Weird wrapping of bash prompt with coloring (`\[` and `\]` being used)

当遇到奇怪的行为时,我正在处理自己的 bash 提示(iTerm 和 macOS 上的 Terminal.app)。我设法将其归结为最小的工作示例:

~/.bash_profile:

WHITE="\[3[1;37m\]"
COLOR_NONE="\[3[0m\]"

# This always wraps correctly
PS1="\u:\w"

# This (added coloring) wraps incorrectly when using small window.
# PS1="${WHITE}\u:\w${COLOR_NONE}"

现在创建一个长目录名

mkdir ~/very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name_very_long_name

cd。问题是:PS1 的第一个版本完美包裹,而只添加一种颜色会破坏小 windows 的包裹。任何人都可以澄清或提供解决方法吗?在末尾添加 \n 是一个选项,但对于简短的提示来说看起来很难看。

谢谢!

我已经看过的来源:

BashFAQ/053 about colors

Issue with \x01 and \x02

UPD: bash版本version 3.2.57(1)-release (x86_64-apple-darwin17)

Bash 总是难以处理带有不可见字符的长提示,所以通常的做法是避免它们。例如,如果路径太长,您可以通过省略路径的开头来自动 trim 提示的长度,或者如果路径很长,您可以自动输出结尾的换行符。 (在这种情况下,您可能想要使用 $COLUMNS,它通常会告诉您 window 的宽度。)

patch 19 to bash v4.4 中(我意识到这与您的环境并不相关,因为您似乎仍在使用默认 OS X 安装提供的 bash 的古董版本) ,一个长期存在的错误已得到纠正,该错误会在某些非常罕见的多行提示同时具有不可见字符和多字节字符的情况下触发段错误。 v4.4.18 和 v4.4.19 之间的行为肯定发生了变化,但即使使用该补丁,当提示扩展到第三行时,很长的提示也会导致问题。

lib/readline/display.c中有注释表明readline库假定提示不会超过两行。我建议你以此为限。