是否有可能在bash的PS1中预先评估一个值?

cor*_*ror 4 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"
Run Code Online (Sandbox Code Playgroud)

这是我想要使用的提示行:

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

不幸的是,看起来__git_ps1运行的程序覆盖了这个$?值,我最终得到的每个表情都是绿色的笑脸,即使在跑步之后也是如此false.

取出__git_ps1电话......

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "
Run Code Online (Sandbox Code Playgroud)

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

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

pyn*_*exj 6

不要放在$(cmd)或`cmd`直接在你的PS1.相反,使用Bash的PROMPT_COMMANDvar.我通常做的是定义一个函数_PS1_cmd和集合PROMPT_COMMAND=_PS1_cmd.然后_PS1_cmd,我设置了我想包括的misc vars 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 :)
Run Code Online (Sandbox Code Playgroud)