__git_ps1 (aktueller Zweig) in der Bash-Eingabeaufforderung ist immer irgendwie veraltet

8

Mein PS1in meinem ~/.bash_profile:

export PS1="\\n\[\033[38;5;246m\]\u@\[\033[38;5;245m\]\h\[\033[38;5;15m\] \[\033[38;5;28m\]\w\[\033[38;5;15m\]\[\033[38;5;2m\]`__git_ps1`\[\033[38;5;15m\] \[\033[38;5;90m\]\t\[\033[38;5;15m\] \[\033[38;5;232m\]\[\033[38;5;15m\] \n\[\033[38;5;0m\]\\$ "

(Entschuldigung, ich habe keine Aliase für meine Farbcodes. Ich habe diese Eingabeaufforderung mit einem Online-Editor erstellt.)

Das ist ein bisschen chaotisch, erzeugt aber eine sehr schöne Eingabeaufforderung: Geben Sie hier die Bildbeschreibung ein

Aber der aktuell angezeigte Zweig ist immer falsch, wenn ich wechsle

falscher Zweig

Ich bin mir nicht sicher, warum das passieren würde. Wenn ich den Befehl selbst ausführe, erhalte ich den richtigen Wert.

$ echo `__git_ps1`
(dev)

Wenn ich das .bash_profile als Quelle verwende, wird der neue Wert eingehen (aber beim nächsten Wechsel falsch sein). Mache ich etwas falsch?

jcollum
quelle
Verwenden Sie einfache Anführungszeichen um die Zuweisung (oder nur das __git_ps1Teil, damit Sie keine Escape-Zeichen während der gesamten Eingabeaufforderung korrigieren müssen), damit es nicht sofort aufgerufen / ausgewertet wird und nicht erweitert wird, damit die Shell zur Anzeigezeit der Eingabeaufforderung aufruft.
Etan Reisner

Antworten:

8
export PS1="…`__git_ps1`…"

Mit `__git_ps1`doppelten Anführungszeichen führt dieser Befehl den Befehl aus __git_ps1und weist der Variablen seine Ausgabe (und anderen umgebenden Text) zu PS1. Daher zeigt Ihre Eingabeaufforderung den Zweig an, der bei der .bash_profileAusführung ermittelt wurde.

Sie müssen __git_ps1jedes Mal ausführen, wenn bash eine Eingabeaufforderung anzeigt. (Eigentlich müssen Sie es nicht erneut ausführen, bis sich die Git-Informationen geändert haben, aber das ist schwer zu erkennen.) Es gibt zwei Möglichkeiten, dies zu tun.

  • Fügen Sie den Literaltext `__git_ps1`in die PS1Variable ein. Stellen Sie sicher, dass bash so konfiguriert ist, dass Shell-Erweiterungen für die Eingabeaufforderungszeichenfolge ausgeführt werden, wobei die promptvarsOption aktiviert ist. Dies ist standardmäßig der Fall, kann jedoch mit deaktiviert werden shopt -u promptvars.

    PS1='\n\[…\]$(__git_ps1)\[…\]\$ '
  • Aktualisieren Sie den Inhalt der Eingabeaufforderung durch einen Befehl, der von der PROMPT_COMMANDVariablen ausgeführt wird.

    update_PS1 () {
      PS1="\\n\\[…\\]$(__git_ps1)\[…\]\\$ "
    }
    shopt -u promptvars
    PROMPT_COMMAND=update_PS1
    

Übrigens ist die Eingabeaufforderung eine Shell-Konfiguration, keine globale Einstellung, daher sollten Sie sie festlegen ~/.bashrc, nicht in~/.bash_profile .

Gilles 'SO - hör auf böse zu sein'
quelle
1
Die erste Option hat wie ein Zauber funktioniert, danke!
Der Pate
5

Es ist nur eine einfache Frage des Zitierens. Wechseln Sie `__git_ps1`zu \$(__git_ps1)oder, wenn Sie Backticks verwenden müssen : \`__git_ps1\`.

Um sich selbst zu überzeugen, ändern Sie einfach Ihre PS1 in (öffnen Sie eine neue Shell-Instanz, wenn Sie sauber zu Ihrem vorherigen Setup zurückkehren möchten):

$ PS1="$(date) >"
Thu Nov 26 20:02:34 EST 2015 >_

Das einzige Problem ist, dass es nicht aktualisiert wird (warten Sie einige Sekunden, bis Sie die Eingabetaste drücken).

Aber das wird:

$ PS1="\$(date) >"
Thu Nov 26 20:06:20 EST 2015
Thu Nov 26 20:06:25 EST 2015

Das ist alles. schreibe exit. (Aktualisieren Sie Ihre Eingabeaufforderung) Machen Sie sich wieder an die Arbeit.


quelle
1

http://mediadoneright.com/content/ultimate-git-ps1-bash-prompt

Beachten Sie unten, dass sie nicht festlegen:

export PS1 = "\ n ...` __git_ps1 ...

Das hat es auf dieses kranke Stück Arbeit gebracht:

export PS1=$IBlack$Time12h$Color_Off'$(git branch &>/dev/null;\

if [ $? -eq 0 ]; then \
  echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; \
  if [ "$?" -eq "0" ]; then \
    # @4 - Clean repository - nothing to commit
    echo "'$Green'"$(__git_ps1 " (%s)"); \
  else \
    # @5 - Changes to working tree
    echo "'$IRed'"$(__git_ps1 " {%s}"); \
  fi) '$BYellow$PathShort$Color_Off'\$ "; \
else \
  # @2 - Prompt when not in GIT repo
  echo " '$Yellow$PathShort$Color_Off'\$ "; \
fi)'

Die relevanten Bits sind "$ (__ git_ps1" (% s) "oder" $ (__ git_ps1 "{% s}").

Petro
quelle
Die relevanten Bits davon sind eigentlich die einfachen Anführungszeichen.
Etan Reisner
Und tatsächlich sind viele Dinge an diesem Snippet bestenfalls unterdurchschnittlich.
Etan Reisner