Próbuję ustawić część mojego monitu dynamicznie przez funkcję, więc .bashrc
mam:
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.sh
skryptu 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 .bashrc
linie, 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)\$ "
Odpowiedzi:
Zgodnie z poleceniem Bash Howto :
źródło
W przypadku użycia
$(..)
w cudzysłowach powłoka oceniała podstawienie polecenia przed przypisaniem doPS1
. Tak więcPS1
zawierał 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:Porównać:
źródło