bash:动态彩色提示

bash:动态彩色提示

我给出了git丰富多彩的提示,但它从未完全起作用。经过这么多尝试,我已经确定了问题所在(完全摆脱git了问题)。这就是它,尽可能简单地表现出症状:

  • 跟进bash:彩色提示符和长命令行,我需要用 来关闭转义序列,\]以便 'readline' 正确计算提示的可见长度
  • 它适用于PS1设置静态地, 但不是动态地
     echo -e '\e[33m\]00\e[0m\]' | tee /tmp/p
     PS1="\n\w`cat /tmp/p`\\\$ "
     PS1='\n\w`cat /tmp/p`\\\$ '
     echo -e '\[\e[33m\]00\[\e[0m\]' | tee /tmp/p

在此处输入图片描述

答案1

看来 Bash(+readline) 在命令替换 ( ) 展开之前就检测到了和。如果\[或是因为替换而出现的,那么它们要达到预期的效果已经太晚了,而且它们会逐字出现。\]PS1`cat /tmp/p`\[\]

它可以PS1静态设置,但不能动态设置

不完全是。PS1在两种情况下,形式上(变量)都是静态的。如果是双引号,`cat /tmp/p`变量包含在赋值期间获得的命令替换结果。如果是单引号,`cat /tmp/p`变量包含此文字字符串。在两种情况下,变量的值在赋值后都是固定的,不会自动更改。

解释后者静态值用于打印提示,它会扩展`cat /tmp/p`。因此,在这种情况下,提示确实是动态的,但变量不是。

解决方案是让变量真正动态化,即让某个变量更新其价值每次都在 shell 需要变量之前。值应该包含来自 的结果`cat /tmp/p`,因此当 shell 开始解释该值时,所有\[\](包括来自 的这些)都在那里。/tmp/p

这可以通过 来完成PROMPT_COMMAND

PROMPT_COMMAND
如果设置,该值将被解释为在打印每个主提示符之前执行的命令($PS1)。

来源

例子:

echo -e '\[\e[33m\]00\[\e[0m\]' | tee /tmp/p      # taken from your code
update_PS1 () { PS1="\n\w`cat /tmp/p`\\\$ "; }
PROMPT_COMMAND=update_PS1

相关内容