Perché la mia funzione non viene rivalutata in PS1?


15

Sto cercando di impostare dinamicamente una parte del mio prompt tramite una funzione, quindi nel mio .bashrcho:

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

Aprire una shell mi dà quello che mi aspetto all'inizio:

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

Tuttavia, quando cambio directory, la parte definita dalla funzione non cambia:

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

Il mio vero obiettivo è quello di utilizzare lo git-prompt.shscript per mostrare il ramo del mio repository git quando sono in uno con bei colori e tutto, ma il problema è che non aggiorna mai il nome del ramo quando cambio i repository. L'esempio banale sopra è la riproduzione più semplice che potrei trovare per la mia domanda.

Le .bashrcrighe che devo integrare lo script git-prompt:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "

In una nota a
margine

Risposte:


22

Secondo il prompt di Bash Howto :

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

È importante notare la barra rovesciata prima del simbolo del dollaro della sostituzione del comando. Senza di esso, il comando esterno viene eseguito esattamente una volta: quando la stringa PS1 viene letta nell'ambiente.


Grazie! Ora, se solo potessi farlo stampare i colori invece delle sequenze di escape restituite dalla funzione ...
darthbith

6

Quando si utilizzava $(..)tra virgolette doppie, la shell ha valutato la sostituzione del comando prima di assegnare a PS1. Pertanto, PS1conteneva solo l'output, non la sostituzione del comando stesso. Utilizzare invece virgolette singole o sfuggire a $, in modo che la stringa venga passata così com'è PS1e quindi valutata quando viene impostato il prompt:

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

Confrontare:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.