2011-04-12 23 views
0

我在得到這個漂亮的小東西我.bashrc更改PS1只有當某個子是不是已經在PS1(bash)的

has_gitbranch() { 
    if [ -e .git ]; then 
    GIT_BRANCH='$(__git_ps1 "%s")' 
    [ "$GIT_BRANCH" != 'master' ] && export PS1="$GIT_BRANCH$PS1" 
    fi 
} 

venv_cd() { 
    cd "[email protected]" && has_gitbranch 
} 
alias cd="venv_cd" 

(我沒有寫我自己,不能記得我來自哪裏得到它)

的問題是,如果我進入的目錄是git倉庫發生這種情況:

[email protected]:~/directory $ 

這很好,但如果我再次進入該目錄,會發生什麼(例如cd .),那麼出現這種情況:

[email protected]:~/directory $ 

並再次:

[email protected]:~/directory $ 

我怎樣才能改變bash的if語句,以便它不預先考慮git的分支名,如果它已經在$PS1

如果是Python的我只想做:

GIT_BRANCH = get_current_git_repo_name() 
if GIT_BRANCH not in PS1: # or PS1.find(GIT_BRANCH) == -1 
     PS1 = GIT_BRANCH + PS1 

回答

1
case "$PS1" in 
"$GIT_BRANCH"*) 
    ;; 
*) 
    PS1="$GIT_BRANCH$PS1" 
    ;; 
esac 

這就是說,你正在解決錯誤的問題;我會將PS1的基本值存儲在其他地方,並始終根據當前回購名稱構建PS1。考慮一下如果你cd /some/other/repo會發生什麼。

+0

在案件陳述中:s/of/in/ – 2011-04-13 11:19:55

+0

這確實回答了問題。但是你是對的,它不能解決移動到不同目錄的問題。但是因爲我也在使用Python虛擬環境,所以還有另一個bash函數可以爲PS1提供其他魔力,所以這對我來說非常合適。 – 2011-04-14 15:38:50

1

我很困惑你爲什麼試圖修改PS1。這沒有必要。這裏是我的末尾:

PS1='.....[\!]$(__git_ps1 "(%s)")\$ ' 

PS1無論何時,只要它顯示shell eval'ed,所以該函數的作用得到運行,它的輸出被在那裏傾倒。如果你想用更多的git-fu來混淆它,就把它包裝在另一個函數中。如果你想在你的提示中的某個地方添加一些靈活的文本,只需要嵌入另一個類似的函數。

爲了記錄在案,這裏是從git-completion.bash採取的例子:

PS1='[\[email protected]\h \W$(__git_ps1 " (%s)")]\$ ' 

這看起來接近你想要達到什麼樣的相當不錯,除了與這個分支的用戶,主機和工作目錄,而不是之後之前。