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

15

Estou tentando ter uma parte do meu prompt definido dinamicamente por uma função, então no meu .bashrceu 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 altero o 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.shscript para mostrar a ramificação do meu repositório git quando estou em uma com cores bonitas e tudo, mas o problema é que ele nunca atualiza o nome da ramificação quando troco de repositório. O exemplo trivial acima é a reprodução mais simples que eu poderia apresentar para minha pergunta.

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

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
darthbith
fonte
Em uma nota lateral, se você quiser um prompt do git, recomendo github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor:

Respostas:

22

De acordo com o prompt do Bash Howto :

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

É importante observar a barra invertida antes do sinal de dólar da substituição do comando. Sem ele, o comando externo é executado exatamente uma vez: quando a sequência PS1 é lida no ambiente.

mgor
fonte
Obrigado! Agora se somente eu poderia obtê-lo para imprimir as cores em vez das sequências de escape retornado da função ...
darthbith
6

Quando você usou $(..)aspas duplas, o shell avaliou a substituição de comandos antes de atribuir a PS1. Assim, PS1continha apenas a saída, não a própria substituição de comando. Em vez disso, use aspas simples ou escape do $, para que a cadeia seja passada como está e PS1, em seguida, avaliada quando o prompt estiver definido:

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

Comparar:

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