4

我正在尝试构建一个 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

4

1 回答 1

7

不要把$(cmd)or`cmd`直接放在你的PS1. 相反,使用 Bash 的PROMPT_COMMANDvar。我通常做的是定义一个函数_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 :)
于 2013-03-28T03:05:13.793 回答