แสดงเฉพาะไดเรกทอรีปัจจุบันและพาเรนต์ใน bash prompt


16

ฉันใหม่เพื่อทุบตีและต้องการให้ฉันแสดงบางอย่างที่ tcsh ไม่สำคัญ แต่หลังจากการค้นหา google ที่ดีฉันยังไม่สามารถทำได้

ฉันต้องการให้ฉันรวมเฉพาะไดเรกทอรีปัจจุบันและผู้ปกครองเช่นนี้

/parent/currentdir $

ใน tcsh สามารถทำได้โดย:

set prompt = "%C2 %"

อย่างไรก็ตามใน bash จนถึงตอนนี้ฉันเพิ่งพบว่าฉันต้องแยกวิเคราะห์ pwd เพื่อให้ได้ผลลัพธ์เดียวกัน

ไม่มีวิธีที่ง่ายกว่าเช่นการทำ:

export PS1="$(some_command) $" 

2
ในทางทฤษฎีPS1='\w \$'; PROMPT_DIRTRIM=2ควรให้ bash ที่เทียบเท่ากับคุณ แต่มันไม่ทำงานอย่างถูกต้องในระบบของฉัน
Mikel

มันใช้งานไม่ได้เลย: GNU ทุบตี, เวอร์ชั่น 3.2.57 (1) -release (x86_64-apple-darwin14)
twalbaum

PROMPT_DIRTRIMเป็นที่รู้จักในทุบตี 4 ฉันเพิ่งทดสอบกับ Ubuntu 16.04 ภายใต้ WSL และมันใช้งานได้ดี!
Mike Branski

คำตอบ:


18

คุณสมบัติการควบคุมของ 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~ %# '

2
นี่ควรเป็นคำตอบที่ยอมรับและมีผู้โหวตมากที่สุด
LarsH

3

ไวยากรณ์สำหรับการรับพาเรนต์และไดเรคทอรี่ปัจจุบันถูกนำมาจาก Munai's คำตอบ

อย่างไรก็ตามตามที่ระบุไว้โดย Gilles รหัสนั้นจะแสดงเฉพาะไดเรกทอรีปัจจุบัน ณ เวลานั้น .bashrcโหลด แต่มันจะไม่เปลี่ยนแปลงเมื่อคุณนำทางระบบไปยังโฟลเดอร์อื่น

การมีสิ่งนี้ใน.bashrcไฟล์ของคุณจะทำให้พรอมต์อัพเดทเป็นไดเรกทอรีปัจจุบันโดยอัตโนมัติ

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
การกำหนดprompt_command()ควรจะทำอะไรด้วยตัวเอง? มันไม่ได้สำหรับฉัน คุณหมายถึงการใช้prompt_command()ในนิยามใหม่ของcd& co เช่นเดียวกับ Gilles หรือคุณหมายถึงPROMPT_COMMAND='...'อะไร
LarsH

2
นอกจากนี้คำสั่งนี้จะล้มเหลวเมื่อ$PWDมีช่องว่าง
LarsH

1
ขอบคุณที่พาฉันกลับมาที่นี่ อ้างถึง $ PWDs เพื่ออนุญาตให้มีช่องว่างและรวมคำสั่งสุดท้าย พรอมต์ปัจจุบันของฉันซับซ้อนกว่านี้ดังนั้นความต้องการคำจำกัดความ prompt_command มิฉะนั้น PS1 = ... ทำงานได้บน
twalbaum

มีแนวคิดใด/บ้างในการล้างข้อมูลเอาต์พุตเมื่อไปที่? ตามที่เขียนไว้คุณจะได้รับ/// $
ezrock

0

สตริง Prompt สามารถเปลี่ยนแปลงได้อย่างง่ายดายในโดยการแก้ไขตัวแปรเปลือกbash PS1มันหมายถึงพรอมต์สตริง 1 ข้อมูลเพิ่มเติมที่นี่

สำหรับตอนนี้ลุกขึ้นbashเปลือกของคุณ

vi ~/.bashrc

ผนวกนิยาม PS1 ในไฟล์

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

บทเรียนเพิ่มเติมที่นี่และที่นี่เพื่อช่วยให้คุณปรับแต่งได้มากขึ้น


1
ฉันเข้าใจวิธีแก้ไขพรอมต์ คำถามของฉันคือวิธีการรับเฉพาะไดเรกทอรีปัจจุบันและผู้ปกครองไม่ใช่เส้นทางทั้งหมด
twalbaum

@twalbaum แก้ไขคำตอบของฉัน
Munai Das Udasin

ดีใจที่ได้ช่วย @twalbaum :)
Munai Das Udasin

1
ชุดนี้จะแจ้งให้ไดเรกทอรีปัจจุบัน ณ เวลา.bashrcโหลดพรอมต์จะไม่เปลี่ยนแปลงหากคุณcdเป็นไดเรกทอรีอื่น! @twalbaum
Gilles 'SO- หยุดความชั่วร้าย'

@Gilles มันสำหรับฉัน
twalbaum

0

อาจจะง่ายกว่าด้วย "~" สำหรับโฮมไดเร็กตอรี่

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

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