คุณสมบัติการควบคุมของ Bash นั้นค่อนข้างคงที่ หากคุณต้องการการควบคุมมากขึ้นคุณสามารถรวมตัวแปรไว้ในพรอมต์ของคุณ ให้แน่ใจว่าคุณยังไม่ได้ปิดตัวเลือกpromptvars
PS1='${PWD#"${PWD%/*/*}/"} \$ '
หมายเหตุเครื่องหมายคำพูดเดี่ยว: การขยายตัวของตัวแปรจะต้องเกิดขึ้นในเวลาที่แสดงพรอมต์ไม่ใช่เวลาที่PS1กำหนดตัวแปร
หากคุณต้องการควบคุมสิ่งที่จะแสดงเพิ่มเติมคุณสามารถใช้การแทนที่คำสั่ง ตัวอย่างเช่นตัวอย่างด้านบนสูญเสีย~ตัวย่อสำหรับไดเรกทอรีบ้าน
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
รหัสนี้ค่อนข้างยุ่งยากดังนั้นแทนที่จะรวมเข้าไปใน PS1ตัวแปรคุณสามารถใช้PROMPT_COMMANDตัวแปรเพื่อเรียกใช้รหัสเพื่อตั้งค่าHPWDจากนั้นใช้รหัสดังกล่าวในพรอมต์ของคุณ
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
เนื่องจากพรอมต์ย่อที่มีการเปลี่ยนแปลงเฉพาะในการเปลี่ยนไดเรกทอรีคุณไม่จำเป็นต้องคำนวณใหม่ทุกครั้งที่มีการแจ้งเตือน Bash ไม่ได้จัดให้มี hook ที่ทำงานกับการเปลี่ยนแปลงไดเรกทอรีปัจจุบัน แต่คุณสามารถจำลองมันได้ด้วยการแทนที่cdและลูกพี่ลูกน้อง
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
โปรดทราบว่าคุณไม่จำเป็นต้องส่งออกและไม่ควรส่งออกPS1เนื่องจากเป็นการตั้งค่าเชลล์ไม่ใช่ตัวแปรสภาพแวดล้อม PS1เชลล์อื่นไม่สามารถเข้าใจการตั้งค่าbash ได้
PS หากคุณต้องการประสบการณ์ที่ดีเปลือกโต้ตอบสลับไปzshซึ่งสิ่งเหล่านี้ (พรอมต์%ขยายส่วนใหญ่ครอบคลุม tcsh ของchpwdฯลฯ ) มีคุณสมบัติพื้นเมือง
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2ควรให้ bash ที่เทียบเท่ากับคุณ แต่มันไม่ทำงานอย่างถูกต้องในระบบของฉัน