Por que minha função não é reavaliada no PS1?

11

Estou tentando ter uma parte do meu prompt definido dinamicamente por uma função, então no meu .bashrc eu tenho:

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

Abrir um shell me dá o que eu espero no começo:

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

No entanto, quando eu mudo de diretório, a parte definida pela função não muda:

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

Meu objetivo real é usar o git-prompt.sh script para mostrar o ramo do meu repositório git quando estou em um com cores bonitas e tudo mais, mas o problema é que ele nunca atualiza o nome da ramificação quando eu altero os repositórios. O exemplo trivial acima é a reprodução mais simples que eu poderia fazer para a minha pergunta.

As linhas .bashrc que eu tenho para integrar o script git-prompt:

source ~/.git-prompt.sh
PS1="\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]$(__git_ps1)\$ "
    
por darthbith 23.07.2015 / 20:28

2 respostas

17

De acordo com Como fazer o Bash :

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

It's important to notice the backslash before the dollar sign of the command substitution. Without it, the external command is executed exactly once: when the PS1 string is read into the environment.

    
por mgor 23.07.2015 / 20:36
6

Quando você usou $(..) entre aspas duplas, o shell avaliou a substituição do comando antes de atribuir a PS1 . Assim, PS1 continha apenas a saída, não a substituição do comando em si. Em vez disso, use aspas simples ou escape do $ , para que a sequência seja passada como é para PS1 e, em seguida, avaliada quando o prompt for definido:

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

Compare:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
    
por muru 23.07.2015 / 20:34