Bash提示符多个命令替换

3

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

set_prompts() {

    PS1="\u@\h in \w "
    PS1+="\$(get_git_repo_details)"
    PS1+="\n"
    PS1+="\$(exit_status_prompt)"
}

现在,exit_status_prompt会打印不同颜色的提示字符,具体取决于$?的值是否为0。
然而,我注意到以上代码中,提示字符的颜色从未更新。但是,如果在将get_git_repo_details的输出附加到$PS1之前,先将exit_status_prompt的输出附加到$PS1中,或者根本不附加get_git_repo_details的输出,那么它就会更新。
有人知道是什么原因吗?谢谢。
编辑:
exit_status_prompt()
{
    if [ $? -ne 0 ]
    then
        highlight 1 "❯ "
    else
        highlight 2 "❯ "
    fi
}
< p > highlight函数使用tput在第二个参数字符串前添加第一个参数指定的颜色。

1个回答

2

在执行set_prompts之前,您需要调用exit_status_prompt,否则$?会被重置。可以推测,exit_status_prompt使用最近执行的命令或分配的退出状态。

set_prompts() {
    esp=$(exit_status_prompt)
    PS1="\u@\h in \w "
    PS1+="$(get_git_repo_details)"
    PS1+="\n"
    PS1+="$esp"
}

我已经取消了命令替换,因为我假设你正在(并且应该)将set_prompts作为PROMPT_COMMAND中的第一个命令运行。


谢谢,chepner。不过,这似乎并没有回答我的问题。我知道我可以使用PROMPT_COMMAND并轻松地使它起作用。但是,即使我在开头设置了esp,除非我将PS1 + =“$(get_git_repo_details)”上面的PS1 +=“$ esp”移动,否则它不会更新。 - Bruce Johnson
我无法确切回答这个问题,因为我不知道exit_status_prompt是什么样子的。但是,每个命令都会更新$?,我假设exit_status_prompt查看$?的当前值。在你的例子中,PS1+="\n"每次在调用exit_status_prompt之前将该值重置为0 - chepner
问题是,如果我将PS1 +="\n"PS1 += "\$(exit_status_prompt)"这两行代码都移到PS1+="$(get_git_repo_details)"上面,那么颜色会正确改变。我已经更新了问题以展示exit_status_prompt函数。 - Bruce Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接