it-swarm.com.de

Warum wird meine Funktion in PS1 nicht neu bewertet?

Ich versuche, einen Teil meiner Eingabeaufforderung durch eine Funktion dynamisch einstellen zu lassen. In meinem .bashrc habe ich also:

asdf ()
{
    echo -n $(pwd)
}
PS1="\[email protected]\h:\w $(asdf)\$ "

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

$ bash
[email protected]:~/test /home/darthbith/test$

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

[email protected]:~/test /home/darthbith/test$ cd ~/test2
[email protected]:~/test2 /home/darthbith/test$

Mein eigentliches Ziel ist es, das git-Prompt.sh-Skript zu verwenden, um den Zweig meines Git-Repositorys anzuzeigen, wenn ich in einem mit hübschen Farben und allem bin, aber das Problem ist, dass der Zweig nie aktualisiert wird Name, wenn ich Repositorys ändere. Das obige triviale Beispiel ist die einfachste Reproduktion, die ich für meine Frage finden konnte.

Die .bashrc Zeilen, in die ich das git-Prompt Skript einbinden muss:

source ~/.git-Prompt.sh
PS1="\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
13
darthbith

Laut Bash Prompt Howto :

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

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.

20
mgor

Wenn Sie $(..) in doppelten Anführungszeichen verwenden, hat die Shell die Befehlsersetzung ausgewertet, bevor Sie PS1 zugewiesen hat. Daher enthielt PS1 nur die Ausgabe, nicht die Befehlssubstitution selbst. Verwenden Sie stattdessen entweder einfache Anführungszeichen oder schließen Sie den $, damit die Zeichenfolge unverändert an PS1 übergeben und 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 $ 
6
muru