我给出了git
丰富多彩的提示,但它从未完全有效。经过这么多步道后,我已经确定了问题所在(完全git
排除了问题)。就是这样,尽可能简单地表现症状:
- 跟进bash: Colorful prompt and long command line,我需要关闭转义序列,
\]
以便“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
似乎 Bash(+readline)在扩展命令替换 ( ) 之前检测到
\[
并\]
in 。如果或由于替换而出现,它们已经为时已晚,无法达到预期的效果并且它们逐字出现。PS1
`cat /tmp/p`
\[
\]
不完全的。形式上
PS1
(变量)在这两种情况下都是静态的。在双引号`cat /tmp/p`
的情况下,变量包含在分配期间获得一次命令替换的结果。在单引号`cat /tmp/p`
的情况下,变量包含此文字字符串。在这两种情况下,变量的值在分配后都是固定的,不会自动更改。仍然当 shell解释后一个静态值以打印提示时,它会扩展
`cat /tmp/p`
. 所以在这种情况下提示确实是动态的,但不是变量。解决方案是使变量真正动态化,即每次在shell 需要变量之前更新其值。该值应包含 from 的结果,因此当 shell 开始解释该值时
`cat /tmp/p`
,所有\[
和\]
(包括这些 from )都在那里。/tmp/p
这可以通过
PROMPT_COMMAND
.(来源)
例子: