Mengapa fungsi saya tidak dievaluasi kembali dalam PS1?

15

Saya mencoba untuk memiliki bagian dari prompt saya diatur secara dinamis oleh suatu fungsi, jadi di saya .bashrcpunya:

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

Membuka shell memberi saya apa yang saya harapkan pada awalnya:

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

Namun, ketika saya mengubah direktori, bagian yang didefinisikan oleh fungsi tidak berubah:

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

Tujuan sebenarnya saya adalah menggunakan git-prompt.shskrip untuk menunjukkan cabang repositori git saya ketika saya berada di satu dengan warna-warna cantik dan segalanya, tetapi masalahnya adalah ia tidak pernah memperbarui nama cabang ketika saya mengubah repositori. Contoh sepele di atas adalah reproduksi paling sederhana yang bisa saya ajukan untuk pertanyaan saya.

.bashrcBaris - baris yang saya harus mengintegrasikan skrip git-prompt:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "
darthbith
sumber
Sebagai tambahan, jika Anda menginginkan prompt git, saya akan merekomendasikan github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

Jawaban:

22

Menurut Bash prompt Howto :

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

Penting untuk memperhatikan garis miring terbalik sebelum tanda dolar pengganti perintah. Tanpa itu, perintah eksternal dijalankan tepat sekali: ketika string PS1 dibaca ke lingkungan.

Tuan
sumber
Terima kasih! Sekarang seandainya saya bisa mendapatkannya untuk mencetak warna alih-alih urutan melarikan diri kembali dari fungsi ...
darthbith
6

Saat Anda menggunakan $(..)tanda kutip ganda, shell mengevaluasi substitusi perintah sebelum ditugaskan PS1. Dengan demikian, PS1hanya berisi output, bukan substitusi perintah itu sendiri. Sebagai gantinya, gunakan tanda kutip tunggal, atau keluar dari $, sehingga string dilewatkan apa adanya PS1, dan kemudian dievaluasi saat prompt disetel:

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

Membandingkan:

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