当我遇到异常行为(在MacOS上为iTerm和Terminal.app)时,我正在使用自己的bash提示符。我设法将其简化为最小的工作示例:
〜/ .bash_profile:
WHITE="\[\033[1;37m\]"
COLOR_NONE="\[\033[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
的第一个版本中,它可以完美包装,而在小窗口中仅添加一个颜色会引起包装不佳。任何人都可以澄清给出解决方法吗?在末尾添加\n
是一种选择,但是对于简短的提示来说很难看。
谢谢!
我已经看到的来源:
UPD :
bash版本version 3.2.57(1)-release (x86_64-apple-darwin17)
答案 0 :(得分:1)
Bash总是很难处理带有不可见字符的长提示,因此通常的做法是避免它们。例如,如果路径太长,则可以省略掉路径的开头来自动调整提示的长度;如果路径太长,则可以自动输出尾随换行符。 (在这种情况下,您可能需要使用$COLUMNS
,通常可以告诉您窗口的宽度。)
在patch 19 to bash v4.4中(由于您似乎仍在使用默认OS X安装提供的bash的旧版本,因此我意识到这与您的环境并不相关),已纠正了一个长期存在的错误,该错误在某些非常罕见的带有不可见字符和多字节字符的多行提示中,具有触发段错误的作用。在v4.4.18和v4.4.19之间,行为肯定发生了变化,但是即使使用该修补程序,当提示延伸到第三行时,很长的提示也会引起问题。
lib/readline/display.c
中有一条注释,它表明readline库假定提示将不超过两行。我建议您以此作为限制。