我给出了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