2015-04-15 18 views
3

我一直想定製我的bash 提示,以便它會像

┌─[error_code_if_not_zero]─[time_short]─[username]─[current_folder]─[git_branch] 
└─▪ 

這裏是我的.bashrc

# command completion 
source /home/falcon/.bin/git-prompt.sh 

GIT_PS1_SHOWDIRTYSTATE=1 
GIT_PS1_SHOWSTASHSTATE=1 
GIT_PS1_SHOWUNTRACKEDFILES=1 
GIT_PS1_SHOWUPSTREAM="auto" 

# function to generate the prompt 
function __prompt_command() { 
    __exit_code="$?" 
    __error_int=""; 
    if [ $__exit_code -ne 0 ]; then 
     __error_int="[\[\e[0;31m\]$__exit_code\[\e[0;37m\]]─" 
    fi 

    PS1="\[\e[0;37m\]┌─$__error_int[\A]─[\[\e[0;35m\]\u\[\e[0;37m\]]─[\[\e[0;33m\]\w\[\e[0;37m\]]\$(__git_ps1 '─[\[\e[0;31m\]%s\[\e[0;37m\]]')\n\[\e[0;37m\]└─▪ \[\e[0;m\]" 
} 

export PROMPT_COMMAND=__prompt_command 

這種配置工作得很好,它顯示了錯誤代碼爲非零時。但麻煩來臨,我只是在終端中按enter(調用空命令) - 返回值保持與最後一個非空命令的返回值相同。例如,發生這種情況時,我只是在終端按enter

┌─[127]─[02:51]─[falcon]─[~] 
└─▪ 
┌─[127]─[02:51]─[falcon]─[~] 
└─▪ 
┌─[127]─[02:51]─[falcon]─[~] 
└─▪ 
┌─[127]─[02:51]─[falcon]─[~] 
└─▪ 

正如你所看到的,error code 127即使是空的命令後仍然存在。 但我希望是這樣的:

┌─[127]─[02:51]─[falcon]─[~] 
└─▪ 
┌─[02:51]─[falcon]─[~] 
└─▪ 
┌─[02:51]─[falcon]─[~] 
└─▪ 
┌─[02:51]─[falcon]─[~] 
└─▪ 

所以,我的問題是,如何清空的$?功能__prompt_command裏面的價值?

+1

那麼,我已經花了很長時間看這個,並沒有解決方案。問題在於範圍 - 在標記爲「可能重複」的變量中,在* users *環境中設置了變量,因此它仍然存在。在上面的問題中,PS1設置在每次需要提示時運行的*函數*中。由於在調用函數時沒有變量存在,我所能想到的唯一解決方案涉及臨時文件,這只是不切實際的。 :( – vastlysuperiorman

回答

1

明白了。首先,信用在哪裏 - anubhava提到的「Detect Empty Command」問題是這部分代碼的作者。

儘管如此,它的工作原理你想(據我可以告訴)的方式。

# command completion 
source /home/falcon/.bin/git-prompt.sh 

GIT_PS1_SHOWDIRTYSTATE=1 
GIT_PS1_SHOWSTASHSTATE=1 
GIT_PS1_SHOWUNTRACKEDFILES=1 
GIT_PS1_SHOWUPSTREAM="auto" 

# function to generate the prompt 
PS1="\[\e[0;37m\]┌─\$([[ -n \$_ret ]] && echo \"[\[\e[0;31m\]\$_ret\[\e[0;37m\]]-\")[\A]─[\[\e[0;32m\]\u\[\e[0;37m\]]─[\[\e[0;33m\]\w\[\e[0;37m\]]\$(__git_ps1 '─[\[\e[0;31m\]%s\[\e[0;37m\]]')\n\[\e[0;37m\]└─▪ \[\e[0;m\]" 
trapDbg() { 
    local c="$BASH_COMMAND" 
    [[ "$c" != "pc" ]] && export _cmd="$c" 
} 

pc() { 
    local r=$? 
    if [[ $r == 0 ]]; then 
     r='' 
    fi 
    trap "" DEBUG 
    [[ -n "$_cmd" ]] && _ret="$r" || _ret="" 
    export _ret 
    export _cmd= 
    trap 'trapDbg' DEBUG 
} 

export PROMPT_COMMAND=pc 
trap 'trapDbg' DEBUG 

我組合了你的代碼和他,並修改了PS1。它現在包含邏輯,只有在設置了$_ret時才顯示方括號。此外,anubhava的代碼總是顯示返回代碼,包括0我添加了條件比特來取消時返回代碼爲0。

總之,你有它。

注意:我沒有什麼git-prompt.sh包含,所以我測試沒有這一點。希望這不會徹底改變任何事情。

+0

謝謝,這對我很有用'git-prompt.sh'用於顯示git分支。 – FalconUA

1

你使用了$後,如果「援引」 /bin/true作爲函數的部分是什麼?值,應該始終將其設置爲0

+0

是的,我在'__error_int = ...'之後嘗試了'exec true'之類的東西,但是它只是在運行一個返回非零值的命令後立即關閉我的終端。** PS **:我是這是我第一次嘗試構建一個arch linux。 – FalconUA

+0

是的,在此之前我沒有看過PROMPT_COMMAND,我確定它是在子shell中調用該命令,所以它不會真的是可能會影響變量,比如父類中的'$?',我不是100%,但我認爲這是事實,對不起,我的回答在這個看起來沒用。 –