我正在尝试设置我的PS1
基于运行时条件的环境变量,所以我使用PROMPT_COMMAND
这样做。假设我想根据$?
值更改 bash 提示符,我的.bashrc
提示符将如下所示:
function prompt_command() {
if [ $? -eq 0 ]; then
BASH_PROMPT="\W --->"
else
BASH_PROMPT="[\t][\u][\w] -x->"
fi;
}
PROMPT_COMMAND=prompt_command
PS1='${BASH_PROMPT} '
我想利用Bash 提示转义序列。不幸的是,这不起作用,因为值按原样显示。
另外,我需要使用中间BASH_PROMPT
变量,因为某些工具正在修改该PS1
值。例如,在进入虚拟环境时,(venv)
会被添加到 之前PS1
,因此我无法动态更新PS1
,prompt_command
因为这会覆盖(venv)
.
为什么这些特殊值没有正确扩展,并且是否存在不意味着生成子 shell 的解决方法?
答案1
为什么这些特殊值没有得到适当扩展?
man 1 bash
说:
Bash 允许通过插入一些解码的反斜杠转义特殊字符来自定义这些提示字符串 [...]
(就你而言\t
,,,,)\u
\w
\W
字符串解码后,通过参数扩展进行扩展,[...]
所以\t
等首先被解码(但你的中没有PS1
!),${BASH_PROMPT}
稍后扩展。从这个扩展中,您的反斜杠转义特殊字符出现,但解码为时已晚。
是否有一种解决方法并不意味着生成子外壳?
是的。我找到了这里
从 Bash 4.4 开始你可以使用
@P
扩展
而不是PS1='${BASH_PROMPT} '
调用
PS1='${BASH_PROMPT@P} '
现在$BASH_PROMPT
将进行与原始解码一致的附加解码PS1
。