แสดงชื่อไดเรกทอรีปัจจุบันเท่านั้น (ไม่ใช่เส้นทางแบบเต็ม) เมื่อแจ้ง bash


71

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

นี่คือสิ่งที่ฉันมีใน.bashrc:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

คำตอบ:


98

เปลี่ยน\w(ตัวพิมพ์เล็ก) เป็น\W(ตัวพิมพ์ใหญ่):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

ลองดูที่Bash Prompt HOWTOเพื่อรับรายละเอียดสนุก ๆ มากมาย ตัวอย่าง:

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

ตัวแปรถ้าตั้งเป็นคำสั่งที่ได้รับการเรียกใช้ก่อนที่จะแสดงพรอมต์ที่ระบุไว้ในPROMPT_COMMAND PS1ในกรณีของคุณPROMPT_COMMANDรันechoคำสั่งบางลำดับ ANSI หลบหนีที่จัดการ titlebar ของ Xterm

หากคุณสงสัยว่าคุณPROMPT_COMMANDกำลังเอาชนะการPS1พร้อมท์ของคุณคุณสามารถทำได้unsetและทดสอบสิ่งต่างๆ:

$ unset PROMPT_COMMAND

สุดท้ายให้แน่ใจว่าคุณกำลังเปลี่ยนPS1คำจำกัดความที่ใช้จริง สถานที่พบบ่อย/etc/bash.bashrc, /etc/profile, ~/.bashrc, ,~/.bash_profile ~/.profileโดยทั่วไปไฟล์ระบบ (แต่ไม่เสมอไป) จะรันก่อนไฟล์ผู้ใช้


อืม ... ฉันเกรงว่ามันจะมีอยู่แล้ว \ w แต่ดูเหมือนว่าcaseคำสั่งนั้นจะแทนที่มันเมื่อฉันอยู่บน xterm และดูเหมือนว่าปัญหาจะอยู่PWDในPROMPT_COMMANDนั้น คุณรู้หรือไม่ว่าฉันควรใส่อะไร
hsribei

4
\w(ตัวพิมพ์เล็ก) ตั้งค่าเป็นพา ธ แบบเต็ม\W(ตัวพิมพ์ใหญ่) ภายนอกข้อมูลรถเป็นบิตสุดท้าย PROMPT_COMMAND กำลังตั้งค่าหัวเรื่องหน้าต่างใน xterm ตรวจสอบตัวแปร TERM ของคุณ หากไม่ได้ขึ้นต้นด้วย "xterm" หรือ "rxvt" แสดงว่า PROMPT_COMMAND ไม่สามารถรันได้
ต้มตุ๋น Quixote

โอ้ใช่แล้ว ขออภัยฉันผสมตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ที่ได้ผล ขอบคุณ! :)
hsribei

คำตอบที่ดี ตรวจสอบให้แน่ใจว่าคุณรีบูตเพื่อให้สิ่งนี้มีผล ขอบคุณ!
รวม

14

คำสั่ง bash แบบง่าย ๆ คือ

${VAR/pattern_to_find/pattern_to_replace}

สำหรับการแสดงไดเรกทอรีสุดท้ายที่คุณสามารถทำได้${PWD/*\//}คือหาสิ่งใดมาก่อนและรวมถึง ' /' และแทนที่ด้วยสิ่งใด

บนเครื่องอูบุนตูฉันใช้:

export PS1='$(whoami):${PWD/*\//}#'. 

1
ฉันชอบคำตอบนี้ดีกว่าคำตอบที่ยอมรับได้เพราะมันเป็นเรื่องทั่วไปสำหรับทุกสถานการณ์แทนที่จะเป็นตรรกะพิเศษในการแยกวิเคราะห์ของ $ PS1 เครื่องมือที่มีประสิทธิภาพยิ่งน้อยจะจดจำและเขียนได้ง่ายขึ้น :)
David Ellis

4

ทางออกของฉันคือการแสดงไดเรกทอรีสามอันดับแรกและ 2 ด้านล่างเมื่อมีมากกว่า 5

ดังนั้นข้อความแจ้งของฉัน (ซึ่งมีข้อมูลอื่นด้วย) ดูเหมือนว่า:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

เมื่อ pwd ของฉันเป็นจริง

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

การติดตั้งพรอมต์ PS1 ของฉันเป็นดังนี้:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch เป็นฟังก์ชั่นที่แสดงสาขา git ปัจจุบันฉันเก็บไว้ใน dotfiles ของฉันมันคือ:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

นี่มันเจ๋งมาก! ขอบคุณมากสำหรับคำตอบนี้
Carlos F

4

โซลูชันของฉันสำหรับเรื่องนี้แตกต่างกันเล็กน้อยเกี่ยวกับฉันจะส่งออกอย่างไรฉันจึงคิดว่าฉันจะแชร์ที่นี่:

สร้างตัวแปรสตริงพรอมต์อื่น PS5 และส่งออกสตริงต่อไปนี้ใน.profile/ .bash_profileไฟล์ของคุณ:

\ u : แสดงชื่อผู้ใช้ปัจจุบัน

\ W : พิมพ์ฐานของไดเรกทอรีทำงานปัจจุบัน

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

ตอนนี้เมื่อใดก็ตามที่คุณจำเป็นต้องใช้ชวเลข - เอ็ด PS เพียงแค่เรียกใช้: eval $PS5


หรือดียิ่งกว่านั้นให้สร้างชื่อแทนใน.bash_aliasesไฟล์ของคุณ: (ขอบคุณ@muru )

alias PS5='export PS1="\u:\W$";';

sourceอีกครั้งและตอนนี้คุณสามารถพิมพ์PS5เพื่อสลับ


1
ดูเหมือนว่าแฟรงเคนนาเลีย ทำไมไม่ใช้นามแฝงหรือฟังก์ชั่น?
muru

1

แสดงชื่อไดเรกทอรีปัจจุบันเท่านั้น (ไม่ใช่เส้นทางแบบเต็ม) เมื่อแจ้ง bash

โซลูชันอื่น ๆ ส่วนใหญ่ใช้ไม่ได้กับฉันในทุกระบบปฏิบัติการที่แชร์ไฟล์ดอทของฉัน: AIX, Windoze และ Linux พอร์ตทุบตีเป็นรุ่นเก่าที่ไม่สนับสนุนโครงสร้างบางอย่างและฉันไม่ต้องการที่จะแยกการดำเนินการอื่น (เช่นsed, awkฯลฯ ) ซึ่งมีราคาแพงอย่างเห็นได้ชัดภายใต้ Cygwin

ต่อไปนี้ยาว แต่นักแสดง:

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

ฉันต้องการให้มันคาย:

/
/usr
/usr/foo
foo/bin

สังเกตุการขาดเครื่องหมายทับชั้นนำในบรรทัดสุดท้ายซึ่งเป็นวิธีที่ฉันชอบ นอกจากนี้คุณสามารถคายออกช่วง 3 DIR_LASTไดเรกทอรีโดยการเปลี่ยนไปหาเรื่อง

นอกจากนี้ฉันพยายามทำด้วย regex BASH_REMATCHแต่ bash v3 ดูเหมือนจะไม่ชอบ parens และฉันไม่สามารถหาวิธีที่จะหนีพวกเขาได้อย่างถูกต้อง ถอนหายใจ


0

ฉันเชื่อว่าตัวเลือกนี้ง่ายกว่ามากเพียงทำ:

echo $PWD | rev | cut -d '/' -f 1 | rev

ดังนั้นกำหนดสิ่งนี้ให้กับตัวแปร PS1 ในไฟล์. bashrc ของคุณ:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'

0
root:~/project#  -> root:~/project(dev)# 

เพิ่มรหัสต่อไปนี้ที่ส่วนท้ายของ ~ / .bashrc ของคุณ

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.