ด้วยชื่อพา ธ แบบบัญญัติเช่นของคุณสิ่งนี้จะใช้งานได้:
set -f --; IFS=/
for p in $pathname
do [ -e "$*/$p" ] || break
set -- "$@" "$p"
done; printf %s\\n "$*"
ซึ่งจะพิมพ์ผ่านองค์ประกอบที่มีอยู่ / เข้าถึงได้ล่าสุดของ$pathname
และทำให้แต่ละองค์ประกอบแยกจากกันในอาร์เรย์ ARG องค์ประกอบที่ไม่มีตัวตนครั้งแรกไม่ถูกพิมพ์ $p
แต่มันจะถูกบันทึกไว้ใน
คุณอาจเข้าหามันตรงกันข้าม:
until cd -- "$path" && cd -
do case $path in
(*[!/]/*)
path="${path%/*}"
;; (*) ! break
esac
done 2>/dev/null && cd -
ที่จะกลับมาอย่างเหมาะสมหรือจะลง$path
ตามที่ต้องการ มันปฏิเสธที่จะพยายามเปลี่ยนแปลง/
แต่ถ้าประสบความสำเร็จจะพิมพ์ทั้งไดเรกทอรีการทำงานปัจจุบันของคุณและไดเรกทอรีที่มันเปลี่ยนเป็น stdout ปัจจุบันของคุณ$PWD
จะถูกใส่$OLDPWD
เช่นกัน
access(2)
ไม่ละเอียดมากดังนั้นวิธีการแก้ปัญหามักจะเกี่ยวข้องกับการเขียนสิ่งที่จะย้ำและทดสอบแต่ละองค์ประกอบในการเปิดเส้นทาง ...