Warum wird meine Funktion in PS1 nicht neu bewertet?

15

Ich versuche , einen Teil meines Prompt Set durch eine Funktion dynamisch zu haben, also in meine .bashrcich:

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

Das Öffnen einer Shell gibt mir zunächst das, was ich erwarte:

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

Wenn ich jedoch das Verzeichnis ändere, ändert sich der von der Funktion definierte Teil nicht:

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

Mein eigentliches Ziel ist es, mithilfe des git-prompt.shSkripts den Zweig meines Git-Repository anzuzeigen, wenn ich in einem mit hübschen Farben und allem bin. Das Problem ist jedoch, dass der Zweigname nie aktualisiert wird, wenn ich das Repository ändere. Das obige triviale Beispiel ist die einfachste Reproduktion, die ich für meine Frage finden konnte.

Die .bashrcZeilen, die ich zum Einbinden des git-prompt-Skripts benötigen:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
Darthbith
quelle
Wenn Sie eine Git-Eingabeaufforderung wünschen, würde ich github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

Antworten:

22

Laut Bash-Eingabeaufforderung Howto :

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

Es ist wichtig, den umgekehrten Schrägstrich vor dem Dollarzeichen der Befehlsersetzung zu beachten. Ohne diesen Befehl wird der externe Befehl genau einmal ausgeführt: wenn der PS1-String in die Umgebung eingelesen wird.

mgor
quelle
Vielen Dank! Wenn ich nur die Farben anstelle der von der Funktion zurückgegebenen Escape-Sequenzen drucken könnte ...
darthbith
6

Bei Verwendung $(..)in doppelten Anführungszeichen hat die Shell die Befehlsersetzung vor der Zuweisung zu ausgewertet PS1. Somit PS1enthielt nur die Ausgabe, nicht die Befehlsersetzung selbst. Verwenden Sie stattdessen entweder einfache Anführungszeichen oder die Escape-Taste, $damit die Zeichenfolge unverändert übergeben PS1und ausgewertet wird, wenn die Eingabeaufforderung festgelegt wird:

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

Vergleichen Sie:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
muru
quelle