git - 是否可以在 bash 的 PS1 中预先评估一个值?

标签 git bash

我正在尝试构建一个 Bash 提示符,它将包含我的 git 分支信息(使用来自 git 的 bash-completion 的 __git_ps1)和一个小彩色笑脸来指示最近运行的命令是否成功。

笑脸是使用我在 SO 上找到的这种技术创建的:

SMILEY="${GREEN}:)${COLOR_NONE}"
FROWNY="${RED}:(${COLOR_NONE}"
STATUS_EMOTICON="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

这是我要使用的提示行:

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${GREEN}\$(__git_ps1 ' %s')${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "

不幸的是,看起来 __git_ps1 运行的程序覆盖了 $? 值,我最终每个表情符号都是绿色笑脸,即使在运行 false.

取出 __git_ps1 调用...

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "

...使表情符号正常工作。

所以我显然需要做的是评估 ${STATUS_EMOTICON} 在运行 __git_ps1 之前,但在 之后包含评估值 __git_ps1 的输出。这可能吗?

最佳答案

不要将 $(cmd)`cmd` 直接放在您的 PS1 中。相反,使用 Bash 的 PROMPT_COMMAND 变量。我通常做的是定义一个函数 _PS1_cmd 并设置 PROMPT_COMMAND=_PS1_cmd。然后在 _PS1_cmd 中,我设置了我想包含在 PS1 中的杂项变量。例如:

THE-OLD-PROMPT # cat prompt.rc
function _PS1_cmd()
{
    local saveExit=$?

    # This non-zero exit will not affect $? on command line
    g_git_ps1=$( echo TESTING; exit 1 )
    if (( saveExit )); then
        g_smiley=':('
    else
        g_smiley=':)'
    fi

    # Seems like this is not necessary, at least with bash 4.2.37. But
    # to be safe, always return it.
    return $saveExit
}

PROMPT_COMMAND=_PS1_cmd
PS1='$g_git_ps1 $g_smiley '
THE-OLD-PROMPT # source ./prompt.rc
TESTING :) ( exit 123 )
TESTING :( echo $?
123
TESTING :) echo $?
0
TESTING :)

关于git - 是否可以在 bash 的 PS1 中预先评估一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673140/

相关文章:

git - 什么时候应该使用 git 孤立分支?

git - 如何阻止樱桃选择到 gerrit 上的特定分支

git - 两个 Git 存储库共享公共(public)代码

git - "Proper" pull git "production branch"到生产服务器的方法

windows - 从 GIT 存储库构建

arrays - 如何将目录列表存储在数组中?

linux - bash 线程限制

linux - 如何从实时日志中提取数据并将其传输到 postgres

bash - 同步保存stdout、stderr和stdout+stderr

linux - ubuntu bash脚本备份/home/$user但保留最新的