2013-03-28 53 views
4

我想构建一个Bash提示符,它将同时具有我的git分支信息(使用git的bash完成中的__git_ps1)和一个小小的彩色笑脸来指示最近运行的命令是否成功。是否可以预先评估bash的PS1中的值?

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

这里的提示行我想用:

的笑脸就是采用这种技术,我发现这里的SO创建

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

不幸的是,它看起来像程序,由__git_ps1运行,覆盖$?的值,并且每次运行false后,每个表情符号都会显示绿色笑脸。

取出__git_ps1电话...

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

...使正确的表情工作。

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

回答

6

请勿将$(cmd)`cmd`直接放入您的PS1。相反,使用Bash的PROMPT_COMMAND var。我通常做的是定义一个函数_PS1_cmd并设置PROMPT_COMMAND=_PS1_cmd。然后在_PS1_cmd中,我设置了我想包含在PS1中的misc vars。例如:

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 :) 
+0

这太好了!不过,我只有一个奇怪的问题。由于我的表情符号是颜色编码的,因此当我显示提示时,我看到周围有很多逃逸代码。我尝试了很多不同的策略来解决这个问题,但是我最终不得不回到使用PS1中原来的'\\'$ {STATUS_EMOTICON} \''部分。尽管如此,我改变了'STATUS_EMOTICON'来基于_PS1_cmd保存的退出代码进行评估,所以现在整个事情按我的意图工作。 – CoreDumpError 2013-03-28 18:35:51