web-dev-qa-db-fra.com

Pourquoi ma fonction n'est-elle pas réévaluée dans PS1?

J'essaie d'avoir une partie de mon invite définie dynamiquement par une fonction, donc dans mon .bashrc j'ai:

asdf ()
{
    echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "

Ouvrir un shell me donne ce que j'attends au début:

$ bash
darthbith@server:~/test /home/darthbith/test$

Cependant, lorsque je change de répertoire, la partie définie par la fonction ne change pas:

darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$

Mon objectif actuel est d'utiliser le git-Prompt.sh script pour afficher la branche de mon référentiel git lorsque je suis dans l'une avec de jolies couleurs et tout le reste, mais le problème est qu'il ne met jamais à jour la branche. nommer quand je change de référentiel. L'exemple trivial ci-dessus est la reproduction la plus simple que j'ai pu trouver pour ma question.

Les lignes .bashrc que je dois intégrer au script git-Prompt:

source ~/.git-Prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
13
darthbith

Selon Guide de l’invite de Bash :

[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin   mail
[2200][giles@nikola:~]$

Il est important de noter la barre oblique inverse avant le signe dollar de la substitution de commande. Sans elle, la commande externe est exécutée une seule fois: lorsque la chaîne PS1 est lue dans l'environnement.

20
mgor

Lorsque vous utilisiez $(..) entre guillemets, le shell évaluait la substitution de commande avant d'assigner à PS1. Ainsi, PS1 ne contenait que la sortie, pas la substitution de commande elle-même. Utilisez plutôt des guillemets simples ou échappez le $ afin que la chaîne soit transmise telle quelle à PS1, puis évaluée lorsque l'invite est définie:

$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $ 

Comparer:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
6
muru