ไดเรกทอรีปัจจุบันอย่างย่อใน shell prompt?


23

vim มีคุณสมบัติที่ดีมากซึ่งมันใช้ในเส้นทางของมันเมื่อมันยาว:

ป้อนคำอธิบายรูปภาพที่นี่

มันย่อเส้นทางไปยังเอกสารในแท็บที่ด้านบน มีวิธีทำสิ่งที่คล้ายกับนี้หรือไม่เพื่อให้ bash prompt ของฉันไม่เป็นเช่นนี้:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
ดังนั้นสิ่งที่คุณต้องการคือrfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ อะไร? เป็นการดีที่ใช้เกณฑ์บางอย่างสำหรับความยาวสูงสุดพร้อมท์?
nicerobot

นั่นคือสิ่งที่ฉันกำลังมองหา
Naftuli Kay

ตกลงฉันให้คำตอบของฉัน
nicerobot

คำตอบ:


14

ลองสิ่งนี้ :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

หรือทุบตีบริสุทธิ์:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

แล้วก็

PS1='\u@\h ${PS1X} $ '

ผลิต (แจ้งให้ทราบล่วงหน้า~สำหรับ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

ฉันปรับปรุงคำตอบของฉันด้วย@ enzotib


1
คุณสามารถให้ตัวอย่างว่าสิ่งนี้จะดูเหมือนเป็นพรอมต์สำหรับลูกหลาน?
Naftuli Kay

(0) ลิงค์ GitHub ของคุณเสีย (1) คุณอาจต้องการดู$PWD~ทดสอบอย่างใกล้ชิด ปัจจุบันถ้าHOMEเป็น/home/edและPWDเป็น/home/edwinaคุณจะได้รับ~winaในรุ่น Perl และ~/inaในรุ่นเปลือก (2) รหัสเชลล์ของคุณสำลักถ้าไดเรกทอรีปัจจุบันมีอักขระตัวแทน (เช่นการขยายชื่อพา ธ ) ใด ๆ ; PWDเช่น /abc/*/def= คุณสามารถแก้ไขปัญหานี้โดยการเพิ่มหรือset -o noglob set -f… (ต่อ)
G-Man พูดว่า 'Reinstate Monica'

(ต่อ) … (3) คุณไม่ต้องการเครื่องมือจัดฟันเกือบมากนัก ในคำสั่ง Perl $HOME(ซึ่งอยู่ในเครื่องหมายคำพูดคู่) และ$PWDดีพอ ในคำสั่งของเชลล์, ช่วงสามอ้างอิงตัวแปรเปลือกจะมีการปรับ แต่สามคนแรกสามารถ"${PWD#$HOME}", และ"$PWD" "$p"(4) ดูคำตอบของ mbentleyและความคิดเห็นของฉันด้วย
G-Man กล่าวว่า 'Reinstate Monica'

15

คล้ายกับคำตอบ @nicerobot แต่ค่อนข้างสั้น:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

นี่จะแสดงผลลัพธ์ตัวอย่างต่อไปนี้:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

ฉันชอบPROMPT_DIRTRIMทุบตี ...

export PROMPT_DIRTRIM=2

จะเปลี่ยนตัวอย่างของคุณเป็น ...

rfkrocktk@work-laptop ../com/tkassembled/ $

มันใช้งานได้สำหรับฉัน


ไม่ได้ทำสิ่งที่เขาถาม แต่ขอบคุณที่แจ้งให้ฉันทราบถึงคุณสมบัติ
nicerobot

3
@nicerobot ใช่คุณมีคำตอบที่แท้จริง :) ฉันรู้ว่ามันไม่ได้ให้ตัวย่อที่เขาขอ แต่บ่อยครั้งเมื่อเราเห็นตัวเลือกที่เรียบง่ายความคาดหวังของเราเปลี่ยนไป มันเป็นมาตรฐานและฉันรู้สึกว่ามันสมควรได้รับการกล่าวถึง
BentFX

1
ฉันรู้สึกว่าหนึ่งในฟังก์ชั่นของ SE ไม่เพียง แต่ให้คำตอบที่สมบูรณ์แบบสำหรับคำถาม แต่ยังให้ตัวเลือกอื่น ๆ สำหรับ OP และผู้อื่นที่ค้นหาคำถามด้วยการค้นหา สังเกตบริบทคำตอบที่ฉันให้ "ฉันชอบ ... ใช้งานได้สำหรับฉัน" บางคนเชื่อว่าสมควรได้รับการโหวต
BentFX

ฉันมักจะดูคำตอบได้รับการลงคะแนนที่ไม่ได้ตอบคำถามโดยตรง แต่ผมเห็นด้วยกับคุณว่าการให้ทางเลือกที่สามารถตอบสนองที่ถูกต้องหรือคำตอบ
nicerobot

คำตอบของ BentFX ไม่ได้ตอบคำถามโดยรวมของ OP แต่โดยรวมแล้วแน่นอนว่าไดเรกทอรีปัจจุบันย่อในเชลล์พรอมต์? ซึ่งสำหรับผู้เข้าชมส่วนใหญ่ในหัวข้อนี้อาจเป็นสิ่งที่พวกเขากำลังมองหา
TNT

4

เพิ่มคำตอบของenzotibตัวอย่างต่อไปนี้จะ:

  1. แปลง/Path/To/Your/Home/เป็น~/(ดังนั้นเส้นทางจะ~/a/b/cแทน/P/T/Y/H/a/b/c)
  2. ใช้ตัวอักษรตัวแรกของ 'ไฟล์ dot' แทนการแสดงเฉพาะจุด ( /a/./c/dจะกลายเป็น/a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

ตรวจสอบให้แน่ใจว่าคุณใช้เครื่องหมายคำพูดเดี่ยวหรือทุบตีจะขยายออกก่อนกำหนด


3

รูปแบบสำหรับใช้ในของคุณPS1คือ\W(ดูPROMPTINGหัวข้อในbashหน้าคน)

PS1="\u@\h \W\$ "

และคุณอาจต้องการอ่านตัวเลือกอื่น ๆ ที่นั่นคุณสามารถทำสิ่งดีๆได้ด้วยบรรทัดคำสั่งของคุณ


2
ฉันคิดว่า \ W ไม่ได้ทำทุกอย่างที่เขาขอ
nicerobot

1
@nicerobot มันไม่ได้ให้การเริ่มต้นครั้งแรกของทุกองค์ประกอบของเส้นทาง แต่มันจะให้ไดเรกทอรีการทำงานปัจจุบันในลักษณะที่สั้นกว่า ฉันค่อนข้างมั่นใจว่ามันเป็นไปไม่ได้ที่จะย่อไดเรกทอรีในลักษณะนั้นโดยไม่ต้องใช้สคริปต์ที่น่าเกลียดบ้างในการดำเนินการแต่ละครั้ง เราจะเห็นสิ่งที่เขาพูดเกี่ยวกับเรื่องนี้
Kevin

1

ฉันชอบผลลัพธ์จากตัวอย่างของ nicerobot แต่ฉันพบปัญหาหนึ่ง ฉันมีไดเรกทอรีที่มียัติภังค์อยู่ในนั้นA-Eและมันก็เห็น-Eว่าเป็นข้อโต้แย้งprintfเมื่อมันเป็นไดเรกทอรีการทำงานปัจจุบันของฉัน ในการแก้ไขปัญหานี้ฉันได้เพิ่มคำพูด--สุดท้ายprintfและเพิ่มเครื่องหมายคำพูดรอบ ๆ เอาต์พุตในกรณีที่ไม่มีสิ่งใดที่จะส่งออก:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) ตรวจสอบปัญหาเกี่ยวกับชื่อไดเรกทอรีที่บรรจุ-เป็นอักขระตัวที่สองได้ดี ในขณะที่มันเป็นความจริงที่--อยู่ในการแก้ปัญหาทั่วไปกับปัญหาของการขัดแย้งที่เริ่มต้นด้วย-วิธีการที่ดีกว่าสำหรับprintfคือการพูดเช่นนี้ยังช่วยป้องกันการขัดแย้งที่มีprintf "%s" "${q:1}" %(ตัวอย่างเช่นลองPWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) ดูความคิดเห็นของฉันเกี่ยวกับคำตอบของ nicerobot ด้วย
G-Man พูดว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.