Bash提示多命令替换

Bash提示多命令替换,bash,Bash,我正在使用以下(简化)函数在.bashrc中设置bash提示符: set_prompts() { PS1="\u@\h in \w " PS1+="\$(get_git_repo_details)" PS1+="\n" PS1+="\$(exit_status_prompt)" } 现在,根据$?的值是否为0,退出状态提示将打印不同颜色的提示字符 但是我注意到,对于上面的代码,提示字符的颜色永远不会更新。但是,如果我在附加get\u git\u repo\u

我正在使用以下(简化)函数在.bashrc中设置bash提示符:

set_prompts() {

    PS1="\u@\h in \w "
    PS1+="\$(get_git_repo_details)"
    PS1+="\n"
    PS1+="\$(exit_status_prompt)"
}
现在,根据
$?
的值是否为0,退出状态提示将打印不同颜色的提示字符

但是我注意到,对于上面的代码,提示字符的颜色永远不会更新。但是,如果我在附加
get\u git\u repo\u details
的输出之前,将
exit\u status\u prompt
的输出附加到
$PS1
,或者根本不附加
get\u git\u repo\u details
的输出,那么它会更新

有人知道这是什么原因吗?谢谢

编辑:


然后,
高亮显示
函数只使用
tput
将第二个参数中的字符串与第一个参数中指定的颜色预先填充。

在执行
设置提示
中的任何其他操作之前,需要调用
退出状态提示
,或者将重置
$?
。大概,
exit\u status\u prompt
使用最近执行的命令或分配的退出状态


我取消了命令替换,因为我假设您正在(并且应该)运行
set\u prompts
,作为
PROMPT\u命令中的第一个命令,谢谢,切普纳。然而,这似乎并没有回答我的问题。我知道我可以使用
PROMPT\u命令
,并使其轻松工作。然而,我不明白为什么,即使我在开始时设置了
esp
,它也不会更新,除非我将
PS1+=“$esp”
移到上面
PS1+=“$(获取git\u repo\u详细信息)
。我不能准确回答这个问题,因为我不知道退出状态提示的样子。但是,每个命令都会更新
$?
,我假设
退出状态\u提示符
会查看
$?
的当前值。在您的示例中,
PS1+=“\n”
每次调用
exit\u status\u prompt
之前都将值重置为
0
。问题是,如果我移动
PS1+=“\n”
PS1+=“\$(exit\u status\u prompt)”
行,使它们位于
PS1+=“$(获取git repo\u详细信息)
上方,则颜色会正确更改。我已更新问题以显示退出状态提示功能。
exit_status_prompt()
{
    if [ $? -ne 0 ]
    then
        highlight 1 "❯ "
    else
        highlight 2 "❯ "
    fi
}
set_prompts() {
    esp=$(exit_status_prompt)
    PS1="\u@\h in \w "
    PS1+="$(get_git_repo_details)"
    PS1+="\n"
    PS1+="$esp"
}