仅当某个子字符串不在PS1中时才更改PS1(bash)

时间:2011-04-12 23:27:25

标签: git bash

我的.bashrc

中有这个小巧的东西
has_gitbranch() {
  if [ -e .git ]; then
    GIT_BRANCH='$(__git_ps1 "%s")'
    [ "$GIT_BRANCH" != 'master' ] && export PS1="$GIT_BRANCH$PS1"
  fi
}

venv_cd () {
   cd "$@" && has_gitbranch
}
alias cd="venv_cd"

(我自己不写,不记得从哪里得到它)

问题是如果我输入一个git repo的目录,就会发生这种情况:

reponamepeterbe@computername:~/directory $

这很好但是如果我再次进入该目录会发生什么(例如cd .)然后会发生这种情况:

reponamereponamepeterbe@computername:~/directory $

再次:

reponamereponamereponamepeterbe@computername:~/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

2 个答案:

答案 0 :(得分:1)

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

那就是说,你正在解决错误的问题;我会将基本的PS1值存储在其他地方,并始终从中构建PS1和当前的repo名称。考虑一下cd /some/other/repo会发生什么。

答案 1 :(得分:1)

我很困惑你为什么要在飞行中修改PS1。这不是必要的。这是我的尾端:

PS1='.....[\!]$(__git_ps1 "(%s)")\$ '
无论何时显示,

PS1都会被shell评估,因此该函数会运行,并且其输出会被转储到那里。如果你想用更多的git-fu搞砸它,只需将它包装在另一个函数中。如果您想在提示中的其他位置使用一些灵活的文本,只需嵌入另一个函数。

对于记录,这是从git-completion.bash获取的示例:

PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

这看起来非常接近你想要实现的目标,除了用户,主机和工作目录之后的分支而不是之前。