Diberi nama path kanonik, seperti milik Anda, ini akan berfungsi:
set -f --; IFS=/
for p in $pathname
do [ -e "$*/$p" ] || break
set -- "$@" "$p"
done; printf %s\\n "$*"
Itu mencetak melalui komponen terakhir yang sepenuhnya tersedia / diakses $pathname, dan menempatkan masing-masing secara terpisah ke dalam array arg. Komponen pertama yang tidak ada tidak dicetak, tetapi disimpan di $p.
Anda mungkin mendekatinya secara berlawanan:
until cd -- "$path" && cd -
do case $path in
(*[!/]/*)
path="${path%/*}"
;; (*) ! break
esac
done 2>/dev/null && cd -
Itu akan kembali dengan tepat atau akan pare $pathsesuai kebutuhan. Itu menolak untuk mencoba perubahan /, tetapi jika berhasil akan mencetak direktori kerja Anda saat ini dan direktori yang diubahnya menjadi stdout. Saat ini Anda $PWDakan dimasukkan ke dalam $OLDPWDjuga.
access(2)tidak terlalu granular, jadi solusinya biasanya melibatkan menulis sesuatu untuk beralih dan menguji setiap elemen path pada gilirannya ...