PROMPT_COMMAND สามารถมีคำสั่ง bash ธรรมดาในขณะที่ตัวแปร PS1 ยังสามารถมีอักขระพิเศษเช่น "\ h" สำหรับชื่อโฮสต์ในตัวแปร
ตัวอย่างเช่นนี่คือพร้อมต์ bash ของฉันที่ใช้ทั้ง PROMPT_COMMAND และ PS1 รหัส bash ใน PROMPT_COMMAND ระบุว่าคุณอาจอยู่ในสาขาคอมไพล์ใดและแสดงสิ่งนั้นที่พรอมต์พร้อมกับสถานะการออกของกระบวนการรันล่าสุดชื่อโฮสต์และชื่อฐานของ pwd ตัวแปร RET เก็บค่าส่งคืนของโปรแกรมที่เรียกใช้ล่าสุด วิธีนี้สะดวกในการดูว่ามีข้อผิดพลาดหรือไม่และรหัสข้อผิดพลาดของโปรแกรมล่าสุดที่ฉันรันในเทอร์มินัล สังเกต 'ด้านนอก' รอบ ๆ นิพจน์ PROMPT_COMMAND ทั้งหมด รวมถึง PS1 เพื่อให้ตัวแปรนี้ถูกประเมินใหม่ทุกครั้งที่ประเมินตัวแปร PROMPT_COMMAND
PROMPT_COMMAND='RET=$?;\
BRANCH="";\
ERRMSG="";\
if [[ $RET != 0 ]]; then\
ERRMSG=" $RET";\
fi;\
if git branch &>/dev/null; then\
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2);\
fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'
ผลลัพธ์ตัวอย่างมีลักษณะเช่นนี้ในไดเร็กทอรี non-git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
และในไดเร็กทอรี git คุณจะเห็นชื่อสาขา:
sashan@dhcp-au-122 rework mybranch $
อัปเดต
หลังจากอ่านความคิดเห็นและคำตอบของ Bob ฉันคิดว่าการเขียนตามที่เขาอธิบายนั้นดีกว่า มันสามารถบำรุงรักษาได้มากกว่าสิ่งที่ฉันเขียนไว้ข้างต้นโดยที่ตัวแปร PS1 ถูกตั้งค่าไว้ใน PROMPT_COMMAND ซึ่งเป็นสตริงที่ซับซ้อนมากซึ่งได้รับการประเมินในรันไทม์โดย bash ใช้งานได้ แต่ซับซ้อนกว่าที่จำเป็น เพื่อความเป็นธรรมฉันเขียนว่า PROMPT_COMMAND สำหรับตัวฉันเองเมื่อประมาณ 10 ปีที่แล้วและได้ผลและไม่ได้คิดมากเกินไปเกี่ยวกับเรื่องนี้
สำหรับผู้ที่สงสัยว่าฉันแก้ไขสิ่งต่าง ๆ ของฉันอย่างไรโดยพื้นฐานแล้วฉันได้ใส่รหัสสำหรับ PROMPT_COMMAND ในไฟล์แยกต่างหาก (ตามที่ Bob อธิบายไว้) จากนั้นสะท้อนสตริงที่ฉันตั้งใจจะเป็น PS1:
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
RED="\[\033[0;31m\]"
PURPLE="\[\033[0;35m\]"
BROWN="\[\033[0;33m\]"
LIGHT_GRAY="\[\033[0;37m\]"
LIGHT_BLUE="\[\033[1;34m\]"
LIGHT_GREEN="\[\033[1;32m\]"
LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
RESTORE="\[\033[0m\]" #0m restores to the terminal's default colour
if [ -z $SCHROOT_CHROOT_NAME ]; then
SCHROOT_CHROOT_NAME=" "
fi
BRANCH=""
ERRMSG=""
RET=$1
if [[ $RET != 0 ]]; then
ERRMSG=" $RET"
fi
if which git &>/dev/null; then
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2)
else
BRANCH="(git not installed)"
fi
echo "${GREEN}\u@\h${SCHROOT_CHROOT_NAME}${BLUE}\w \
${CYAN}${BRANCH}${RED}${ERRMSG} \$ $RESTORE"
และใน. bashrc ของฉัน
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command
if git branch &>/dev/null ; then\
. มันเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปที่ / dev / null tldp.org/LDP/abs/html/io-redirection.html