Dlaczego moja funkcja nie jest ponownie oceniana w PS1?

15

Próbuję ustawić część mojego monitu dynamicznie przez funkcję, więc .bashrcmam:

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

Otwarcie powłoki daje mi to, czego na początku oczekuję:

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

Jednak gdy zmieniam katalog, część zdefiniowana przez funkcję nie zmienia się:

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

Moim rzeczywistym celem jest użycie git-prompt.shskryptu do pokazania gałęzi mojego repozytorium git, gdy jestem w jednym z ładnymi kolorami i wszystkim, ale problem polega na tym, że nigdy nie aktualizuje nazwy gałęzi, gdy zmieniam repozytoria. Ten trywialny przykład powyżej jest najprostszą reprodukcją, jaką mogłem wymyślić dla mojego pytania.

Te .bashrclinie, które muszę zintegrować skrypt git-prompt:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
darthbith
źródło
Na marginesie, jeśli chcesz otrzymać polecenie git, polecam github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

Odpowiedzi:

22

Zgodnie z poleceniem Bash Howto :

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

Ważne jest, aby zauważyć odwrotny ukośnik przed znakiem dolara zastępowania polecenia. Bez tego polecenie zewnętrzne jest wykonywane dokładnie raz: gdy łańcuch PS1 jest wczytywany do środowiska.

mgor
źródło
Dziękuję Ci! Teraz gdybym tylko mógł sprawić, by wydrukował kolory zamiast sekwencji ucieczki zwróconych z funkcji ...
darthbith,
6

W przypadku użycia $(..)w cudzysłowach powłoka oceniała podstawienie polecenia przed przypisaniem do PS1. Tak więc PS1zawierał tylko dane wyjściowe, a nie samą substytucję polecenia. Zamiast tego użyj albo pojedynczych cudzysłowów, albo użyj znaku ucieczki $, aby ciąg był przekazywany w stanie „jak jest” PS1, a następnie analizowany, gdy ustawiony jest monit:

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

Porównać:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
muru
źródło