2011-04-12 42 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)")]\$ ' 

这看起来接近你想要达到什么样的相当不错,除了与这个分支的用户,主机和工作目录,而不是之后之前。