Dlaczego mój monit bash nie jest aktualizowany?

83

Jestem nowy w git i próbuję dodać bieżącą gałąź git do mojego już istniejącego znaku zachęty, który jest zdefiniowany w następujący sposób:

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

export PS1="${RESET}${YELLOW}\u@\h${NORMAL} \`${SELECT}\` ${YELLOW}\w $(__git_ps1) >${NORMAL} "

Wypróbowałem to ( .bashrcponownie pozyskując plik) i wydawało się, że działa, ale potem przeszedłem na inną gałąź i nie zaktualizowałem się. Jak mogę się upewnić, że $(__git_ps1)plik nie jest zapisany w pamięci podręcznej?

greg0ire
źródło
14
Uwielbiam pomysł, aby mieć :)i :(w twoim monicie w zależności od tego, czy ostatnie polecenie zawiodło :)
Mark Longair
@Mark Longair: Znalazłem to tutaj: serverfault.com/questions/4889/ ... BTW, dlaczego usunąłeś swoje rozwiązanie, to też działa!
greg0ire
było kilka minut później niż pozostałe dwa, a i tak jest mniej schludne niż @ geekosaur's
Mark Longair
1
Dziękuję bardzo za zadanie tego pytania (i oczywiście geekozaura za jego odpowiedź)! Bawiam się przez GODZINY, próbując dowiedzieć się, dlaczego mój znak zachęty aktualizował tylko linię statusu git, kiedy pozyskiwałem plik .bashrc.
coredumperror

Odpowiedzi:

132

Potrzebujesz odwrotnego ukośnika, $aby nie był natychmiast rozwijany. (Porównaj z `...`, który jest innym sposobem pisania $(...).)

export PS1="${RESET}${YELLOW}\u@\h${NORMAL} \`${SELECT}\` ${YELLOW}\w \$(__git_ps1) >${NORMAL} "

Zgodziłbym się z @MikeSep na temat używania pojedynczych cudzysłowów, ale w rzeczywistości nieco bardziej optymalne jest natychmiastowe zastąpienie kolorów i tym podobnych. Nie jest to konieczne, tylko trochę lepiej. Powiedział, że jest łatwiejszy do zrozumienia tego, co się dzieje, jeśli używasz apostrofów.

geekozaur
źródło
2
Ponadto, jeśli kiedykolwiek pracujesz z rzeczami innymi niż programy terminalowe bezpośrednio (bufory poleceń Emacsa / Vima screen, itp.), Możesz chcieć przyjrzeć się używaniu tputzamiast zakodowanych na stałe kolorów ucieczki.
geekozaur
1
Myślę, że w tym przypadku konieczne jest zastąpienie zmiennych kolorów - przynajmniej dostaję kody ucieczki z sugestią @ MikeSep, podczas gdy twoja działa dobrze. (+1)
Mark Longair
@Mark: To interesujące; ${SELECT}jeden pokazuje, że ocena rekurencyjna jest wykonywana. Może to tylko dla poleceń? Generalnie używam funkcji PS1, ponieważ łatwiej jest dowiedzieć się, co się dzieje.
geekozaur
Dzięki @geekosaur
smonff
3
człowieku, jesteś zbawcą życia. Mam jednak pytanie: mam MBP i iMaca. Ten sam .bash_profile, ta sama wersja basha (zainstalowana przez homebrew). na MBP, jeśli nie dodam \ przed znakiem $(__git_ps1), nie zostanie on oceniony. Jeśli zrobię to samo na komputerze iMac, zostanie on oceniony nawet bez \. Masz jakiś pomysł, jak to się może stać?
molli
24

Twój PS1ciąg jest prawdopodobnie oceniany, zanim zostanie zapisany, ale naprawdę chcesz, aby __git_ps1polecenie było uruchamiane za każdym razem, gdy pojawi się wiersz polecenia. Zalecam używanie pojedynczych cudzysłowów zamiast podwójnych cudzysłowów w export PS1='${RESET}...'wierszu.

Mike Seplowitz
źródło
może zadziałać, ale mam problemy z konwersją całego systemu na pojedyncze cudzysłowy, więc użyję rozwiązania geekozaura. Ale ty też dostałeś mój głos za.
greg0ire,
O tak. Jego jest lepsze - brakowało mi miejscowych vars dla kolorów. Mimo wszystko dzięki za głosowanie. :)
Mike Seplowitz