2011-04-12 5 views
0

J'ai cette petite chose nifty dans mon .bashrc:Changer PS1 que si une certaine sous-chaîne est pas déjà dans 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" 

(je ne l'ai pas écrit moi-même et ne peut rappelez-vous où je l'ai eu)

Le problème est que si je rentre dans un répertoire qui est un git cela se produit:

[email protected]:~/directory $ 

C'est bien, mais ce qui se passe si je rentre à nouveau dans ce répertoire (par exemple cd .), cela se produit:

[email protected]:~/directory $ 

Et encore:

[email protected]:~/directory $ 

Comment puis-je changer le bash instruction if afin qu'il ne préfixer pas le nom de la branche git si elle est déjà en $PS1?

Si c'était Python, je voudrais juste faire ceci:

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

Répondre

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

Cela dit, vous êtes résoudre le mauvais problème; Je voudrais stocker la valeur de base PS1 ailleurs et toujours construire PS1 de cela et le nom de repo actuel. Considérez ce qui se passera si vous cd /some/other/repo.

+0

Dans la déclaration de cas: s/of/in/ –

+0

Cela répond à la question. Mais vous avez raison, cela ne résout pas le problème en passant à un répertoire différent. Cependant, puisque j'utilise aussi des environnements virtuels Python, il y a une autre fonction de bash qui fait de la magie à la PS1, donc ça fonctionne parfaitement pour moi. –

1

Je suis assez confus pourquoi vous essayez de modifier PS1 à la volée. Ce n'est pas nécessaire. Voici la fin de la queue de la mine:

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

PS1 est eval'ed par le shell chaque fois qu'il est affiché, de sorte que la fonction ne se faire écraser, et sa sortie se fait larguer là-dedans. Si vous voulez jouer avec un peu plus de git-fu, enveloppez-le dans une autre fonction. Si vous voulez un texte flexible ailleurs dans votre invite, il suffit d'intégrer une autre fonction de la même manière.

Pour mémoire, voici l'exemple tiré de git-completion.bash:

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

Cela ressemble bigrement à ce que vous essayez d'atteindre, à l'exception de la branche après que l'utilisateur, hôte et répertoire de travail au lieu de avant.

Questions connexes