ทำไมฟังก์ชั่นของฉันไม่ได้รับการประเมินใหม่ใน PS1


15

ฉันกำลังพยายามให้ส่วนหนึ่งของพรอมต์ของฉันตั้งค่าแบบไดนามิกโดยฟังก์ชั่นดังนั้นในฉันของ.bashrcฉัน:

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

การเปิดเปลือกให้สิ่งที่ฉันคาดหวังในตอนแรก:

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

อย่างไรก็ตามเมื่อฉันเปลี่ยนไดเรกทอรีส่วนที่กำหนดโดยฟังก์ชั่นจะไม่เปลี่ยนแปลง:

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

เป้าหมายที่แท้จริงของฉันคือการใช้git-prompt.shสคริปต์เพื่อแสดงสาขาของที่เก็บ git ของฉันเมื่อฉันอยู่ในที่เดียวที่มีสีสวยและทุกอย่าง แต่ปัญหาคือมันไม่เคยอัปเดตชื่อสาขาเมื่อฉันเปลี่ยนที่เก็บ ตัวอย่างเล็ก ๆ น้อย ๆ ข้างต้นคือการทำสำเนาที่ง่ายที่สุดที่ฉันสามารถหาได้สำหรับคำถามของฉัน

.bashrcเส้นที่ผมจะต้องบูรณาการคอมไพล์สคริปต์พรอมต์:

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

ในบันทึกด้านข้างหากคุณต้องการให้คอมไพล์ฉันอยากจะแนะนำgithub.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

คำตอบ:


22

ตามBash prompt Howto :

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

สิ่งสำคัญคือการสังเกตแบ็กสแลชก่อนเครื่องหมายดอลลาร์ของการทดแทนคำสั่ง ก็ไม่มีคำสั่งภายนอกจะถูกดำเนินการเพียงครั้งเดียว: เมื่อสตริง PS1 ถูกอ่านในสภาพแวดล้อม


ขอขอบคุณ! ตอนนี้ถ้าเพียงฉันได้รับมันเพื่อพิมพ์สีแทนลำดับ escape ที่ส่งคืนจากฟังก์ชั่น ...
darthbith

6

เมื่อคุณใช้ในราคาสองครั้งเปลือกประเมินแทนคำสั่งก่อนที่จะมอบหมายให้$(..) PS1ดังนั้นจึงPS1มีเพียงเอาท์พุทไม่แทนตัวเองคำสั่ง แต่ให้ใช้เครื่องหมายคำพูดเดี่ยวหรือหลีกเลี่ยงแทน$เพื่อให้สตริงถูกส่งตามที่เป็นไปPS1แล้วประเมินผลเมื่อตั้งค่าพรอมต์:

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

เปรียบเทียบ:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.