คุณสมบัติการควบคุมของ 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 ที่เทียบเท่ากับคุณ แต่มันไม่ทำงานอย่างถูกต้องในระบบของฉัน