pwd
ให้ฉัน
/data/users/me/some/random/folder
มีวิธีง่าย ๆ ในการรับ
~/some/random/folder
จากpwd
ไหน
pwd
แนะนำให้ตั้งชื่อสิ่งที่ส่งผลให้คำสั่งอื่นที่ไม่ใช่ มิฉะนั้นคุณจะทำลายสคริปต์ที่คาดว่าจะใช้ผลลัพธ์ในบริบทที่ไม่ได้ดำเนินการขยายตัวหนอน
pwd
ให้ฉัน
/data/users/me/some/random/folder
มีวิธีง่าย ๆ ในการรับ
~/some/random/folder
จากpwd
ไหน
pwd
แนะนำให้ตั้งชื่อสิ่งที่ส่งผลให้คำสั่งอื่นที่ไม่ใช่ มิฉะนั้นคุณจะทำลายสคริปต์ที่คาดว่าจะใช้ผลลัพธ์ในบริบทที่ไม่ได้ดำเนินการขยายตัวหนอน
คำตอบ:
หากคุณกำลังใช้ bash แสดงว่าdirs
builtin มีพฤติกรรมที่ต้องการ:
dirs +0
~/some/random/folder
(หมายเหตุ+0
ไม่ใช่-0
)
ด้วยzsh
:
dirs
~/some/random/folder
ก่อนอื่นเราต้องเคลียร์ไดเรกทอรีสแต็กมิฉะนั้นdirs
จะพิมพ์เนื้อหาทั้งหมด:
dirs -c; dirs
หรือzsh
's print
builtin:
print -rD $PWD
หรือ
print -P %~
(ที่หนึ่งเปิดขยายพร้อมท์ . %~
ใน$PS1
ขยายไปยังไดเรกทอรีปัจจุบันด้วย$HOME
แทนที่ด้วย~
แต่ยังจัดการไดเรกทอรีที่มีชื่ออื่น ๆเช่นไดเรกทอรีบ้านของผู้ใช้รายอื่นหรือไดเรกทอรีที่มีชื่อที่คุณกำหนดเอง)
คุณสามารถใช้คุณสมบัติการแทนที่สตริงย่อย Bash:
$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
ksh
zsh
${string/#substring/replacement}
เวอร์ชันเพื่อป้องกันพฤติกรรมนี้
echo
) zsh
ใน ในเปลือกหอยอื่น ๆ$HOME
จะถือว่าเป็นรูปแบบและสิ่งทั้งหมดที่อยู่ภายใต้การแยก + glob
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
การใช้sed
:
pwd | sed "s|^$HOME|~|"
แนวคิดคือการใช้อักขระใด ๆ ที่มีโอกาสน้อยที่จะปรากฏในพา ธ โฮมไดเร็กทอรีเป็นตัวคั่นในsed
regex |
ในตัวอย่างข้างต้นผมใช้
สิ่งที่ดีเกี่ยวกับเทคนิคนี้คือมันเป็นอิสระจากเปลือก
นอกจากนี้คุณยังสามารถตั้งชื่อpwd
เพื่อ/bin/pwd | sed "s|$HOME|~|"
รับพฤติกรรมนี้ในสคริปต์อื่น ๆ ที่อาจใช้งานpwd
อยู่
^
จุดยึดใน regex ของคุณ มิฉะนั้นเป็นไปได้ (แต่ไม่น่าเป็นไปได้) ที่จะแทนที่ส่วนที่อยู่ตรงกลางของเส้นทาง
"s|^/home/user\(/.*\)\?$|~\1|"
ควรมีลักษณะดังต่อไปนี้ มิฉะนั้นมันตรงกับเส้นทางที่ผู้ใช้คนอื่นถ้าชื่อของพวกเขาเป็นเหมือนuser1
, user2
, user3
และคุณตรงกับเพียงuser
tilde=\~${PWD#~}
ฉันคิดว่านั่นคือสิ่งที่คุณต้องการ?
สิ่งที่เรียบร้อยเกี่ยวกับตัวหนอนคือเมื่อมันถูกขยายออกเป็นลวดลายมันไม่จำเป็นต้องมีการอ้างอิง การใช้$HOME
วิธีเดียวกันโดยไม่มีเครื่องหมายคำพูดจะทำให้เกิดผลลัพธ์ที่คาดเดาไม่ได้เนื่องจากอักขระที่เป็นองค์ประกอบใด ๆ อาจเป็นอักขระรูปแบบและอาจไม่ได้ผลลัพธ์ที่คาดหวังเสมอไป
แต่การขยายตัวของตัวหนอนนั้นจะเกิดขึ้นเสมอราวกับว่ามันเป็นผลมาจากการขยายตัวที่ยกมาและเพื่อให้ผลลัพธ์ที่สามารถคาดการณ์ได้ สิ่งนี้ดูเหมือนว่าจะเป็นจริงในทุก ๆ เชลล์ที่ฉันทดสอบทั้งcase
รูปแบบและรูปแบบพารามิเตอร์โดยมีข้อยกเว้นที่น่าทึ่งของทั้งสองksh93
และmksh
ไม่ว่าด้วยเหตุผลใด - ซึ่งดูเหมือนจะไม่ให้เกียรติในแง่มุมของเครื่องหมายตัวหนอน
อีกสิ่งที่เรียบร้อยเกี่ยวกับเรื่องนี้คือคุณสามารถกำหนดใหม่$HOME
เพื่อจัดการไดเรกทอรีใด ๆ ในแบบเดียวกัน ตัวอย่างเช่น:
cd ~
HOME=/some/prefix/I/would/like/to/trim
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD
นี่เป็นอีกตัวอย่าง:
set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
HOME=${*#~/}/$d
set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~
$PWD
$HOME
คุณสามารถใช้แนวคิดเดียวกันรวมกับการแทนที่รูปแบบเพื่อทำให้เป็นเรื่องทั่วไปมากขึ้น เป็น${PWD/#~/\~}
อย่างไร
คุณสามารถลองเปลี่ยนชิ้นส่วนที่ไม่ต้องการด้วยsed
:
pwd | sed 's,^/data/users/me,~,'
หรือดีกว่า:
pwd | sed "s,^$HOME,~,"
^
จุดยึดเพื่อให้แน่ใจว่าการจับคู่ที่จุดเริ่มต้นของเส้นทางไดเรกทอรีจะถูกแทนที่เท่านั้น นอกจากนี้คุณไม่จำเป็นต้องใช้g
เพราะคำสั่งควรแทนที่ 1 เหตุการณ์ที่เกิดขึ้นมากที่สุด
/home/alice
/home/aliceinchains
แต่ถ้าครั้งเดียวที่ฉันต้องการใช้ฟีเจอร์นี้คือเมื่อฉันรู้ว่าฉันคือโฮมไดเร็กตอรี่ของฉันหรือหนึ่งในไดเร็กตอรี่ย่อยของมัน, มันน่าจะใช้ได้.