2013-03-28 54 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