【问题标题】:Bash prompt multiple command substitutionBash 提示多个命令替换
【发布时间】:2016-08-06 21:48:17
【问题描述】:

我正在使用以下(简化的)函数在 .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 的输出之前将exit_status_prompt 的输出附加到$PS1,或者根本不附加get_git_repo_details 的输出,那么它确实会更新。

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

编辑:

exit_status_prompt()
{
    if [ $? -ne 0 ]
    then
        highlight 1 "❯ "
    else
        highlight 2 "❯ "
    fi
}

然后highlight 函数只使用tput 在第二个参数中的字符串前面加上第一个参数中指定的颜色。

【问题讨论】:

    标签: bash


    【解决方案1】:

    在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 中的第一个命令。

    【讨论】:

    • 谢谢,切普纳。但是,这似乎无法回答我的问题。我知道我可以使用PROMPT_COMMAND 并让它轻松工作。但是,我不明白为什么,即使我在开始时设置了esp,它也不会更新,除非我将PS1+="$esp" 移到PS1+="$(get_git_repo_details)" 上方。
    • 我无法准确回答这个问题,因为我不知道exit_status_prompt 长什么样。但是,每个命令都会更新$?,我假设exit_status_prompt 会查看$? 的当前值。在您的示例中,每次调用 exit_status_prompt 之前,PS1+="\n" 都会将值重置为 0。
    • 问题是,如果我将PS1+="\n" 和PS1+="\$(exit_status_prompt)" 行都移动到PS1+="$(get_git_repo_details)" 上方,颜色会正确更改。我已更新问题以显示 exit_status_prompt 函数。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    相关资源
    最近更新 更多