if子句的提示定制问题

if子句的提示定制问题

我最近稍微调整了一下我的 PS1。代码如下:

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

缺失的字符来自书呆子字体在我的问题(以及assemble_prompt功能)中并不重要。

我遇到的问题是,当我将终端窗口大小缩小到提示符大小(大约)时,PS1 损坏。然后它似乎忽略 PS1 设置并将 PS1 设置为$仅字符(参见屏幕截图)。请注意,当我开始输入时,它只会覆盖我的自定义提示。

PS1 疯了

我将问题缩小到 if 子句,如果上一个命令不成功,则添加“fail”字符。如果我删除该部分,一切都会按预期进行。

有没有办法保留if子句部分,但修复窗口尺寸太小时 PS1 重置的问题?

PS 我使用rxvt-unicode作为我的终端,但问题仍然存在于所有其他终端中(经过测试xtermst)。

答案1

您可能想要将终端控制代码括起来,\[...\]以告诉 Bash 它们实际上并未打印字符。否则,当它们尝试计算提示符的宽度时,会使 shell 感到困惑。

所以使用"\[\e[91m\]xxx\[\e[0m\]".

来自手动的

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

相关内容