¿Por qué mi función no se vuelve a evaluar en PS1?

14

Estoy tratando de tener una parte de mi indicador configurada dinámicamente por una función, así que en mi .bashrctengo:

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

Abrir un caparazón me da lo que espero al principio:

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

Sin embargo, cuando cambio el directorio, la parte definida por la función no cambia:

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

Mi objetivo real es usar el git-prompt.shscript para mostrar la rama de mi repositorio git cuando estoy en uno con bonitos colores y todo, pero el problema es que nunca actualiza el nombre de la rama cuando cambio los repositorios. El ejemplo trivial anterior es la reproducción más simple que se me ocurrió para mi pregunta.

Las .bashrclíneas que tengo para integrar el script git-prompt:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
Darthbith
fuente
En una nota al margen, si desea un indicador de git, recomendaría github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

Respuestas:

21

De acuerdo con Bash prompt Howto :

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

Es importante notar la barra invertida antes del signo de dólar de la sustitución del comando. Sin él, el comando externo se ejecuta exactamente una vez: cuando la cadena PS1 se lee en el entorno.

mgor
fuente
¡Gracias! Ahora, si pudiera conseguir que imprima los colores en lugar de las secuencias de escape devueltas de la función ...
darthbith
6

Cuando lo usó $(..)entre comillas dobles, el shell evaluó la sustitución del comando antes de asignarlo PS1. Por lo tanto, PS1contenía solo la salida, no la sustitución del comando en sí. En su lugar, use comillas simples o escape de $, para que la cadena se pase como está PS1y luego se evalúe cuando se establezca la solicitud:

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

Comparar:

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