Warum wird meine Bash-Eingabeaufforderung nicht aktualisiert?

83

Ich bin neu in Git und versuche, den aktuellen Git-Zweig zu meiner bereits vorhandenen Eingabeaufforderung hinzuzufügen, die wie folgt definiert ist:

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} "

Ich habe es versucht (indem ich meine .bashrcDatei erneut bezogen habe) und es schien zu funktionieren, aber dann bin ich in einen anderen Zweig gegangen und es wurde nicht aktualisiert. Wie kann ich sicherstellen, dass das $(__git_ps1)nicht zwischengespeichert ist?

greg0ire
quelle
14
Ich liebe die Idee, :)und :(in Ihrer Eingabeaufforderung abhängig davon, ob der letzte Befehl fehlgeschlagen ist :)
Mark Longair
@ Mark Longair: Ich habe es hier gefunden: serverfault.com/questions/4889/… Übrigens , warum haben Sie Ihre Lösung gelöscht, es funktioniert auch!
Greg0ire
Es war Minuten später als die beiden anderen und ist sowieso weniger ordentlich als @ Geekosaur
Mark Longair
1
Vielen Dank, dass Sie genau diese Frage gestellt haben (und natürlich Geekosaurier für seine Antwort)! Ich habe STUNDEN lang herumgespielt, um herauszufinden, warum meine Eingabeaufforderung die Git-Statuszeile nur aktualisiert hat, als ich meine .bashrc-Datei bezogen habe.
Coredumperror

Antworten:

132

Sie benötigen einen Backslash auf dem, $damit es nicht sofort erweitert wird. (Vergleiche mit dem `...`, was eine andere Schreibweise ist $(...).)

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

Ich würde @MikeSep in Bezug auf die Verwendung von einfachen Anführungszeichen zustimmen, aber es ist tatsächlich ein bisschen optimaler, die Farben und dergleichen sofort ersetzen zu lassen. Nicht notwendig, nur etwas besser. Das heißt, es ist einfacher zu verstehen, was los ist, wenn Sie die einfachen Anführungszeichen verwenden.

Geekosaurier
quelle
2
Wenn Sie jemals direkt mit anderen Dingen als Terminalprogrammen arbeiten (Emacs / Vim-Befehlspuffer screenusw.), sollten Sie auch die Verwendung tputvon hartcodierten Farb-Escapezeichen in Betracht ziehen .
Geekosaurier
1
Ich denke, in diesem Fall müssen die Farbvariablen ersetzt werden - zumindest bekomme ich nur die Escape-Codes mit dem Vorschlag von @ MikeSep, während Ihre gut funktioniert. (+1)
Mark Longair
@ Mark: Das ist interessant; Der ${SELECT}eine zeigt, dass eine rekursive Auswertung durchgeführt wird. Vielleicht ist es nur für Befehle? Im Allgemeinen verwende ich stattdessen eine PS1-Funktion, weil es einfacher ist, herauszufinden, was los ist.
Geekosaurier
Vielen Dank, dass Sie @geekosaur
smonff
3
Mann, du bist ein Lebensretter. Ich habe jedoch eine Frage: Ich habe einen MBP und einen iMac. Gleiches .bash_profile, gleiche Version der Bash (installiert über Homebrew). Wenn ich auf dem MBP das \ vor dem nicht hinzufüge $(__git_ps1), wird es nicht ausgewertet. Wenn ich das Gleiche auf dem iMac mache, wird es auch ohne das \ ausgewertet. Irgendeine Idee, wie das passieren kann?
Molli
24

Ihre PS1Zeichenfolge wird wahrscheinlich ausgewertet, bevor sie gespeichert wird. Sie möchten jedoch, dass der __git_ps1Befehl jedes Mal ausgeführt wird, wenn Sie eine Eingabeaufforderung erhalten. Ich würde empfehlen, einfache Anführungszeichen anstelle von doppelten Anführungszeichen für Ihre export PS1='${RESET}...'Zeile zu verwenden.

Mike Seplowitz
quelle
mag funktionieren, aber ich habe Probleme, das gesamte System in einfache Anführungszeichen umzuwandeln, also werde ich die Lösung von Geekosaur verwenden. Aber du bekommst auch meine Gegenstimme.
Greg0ire
Ah ja. Sein ist besser - ich habe die lokalen Farben für Farben vermisst. Trotzdem danke für die Abstimmung. :)
Mike Seplowitz