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 $path
sesuai 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 $PWD
akan dimasukkan ke dalam $OLDPWD
juga.
access(2)
tidak terlalu granular, jadi solusinya biasanya melibatkan menulis sesuatu untuk beralih dan menguji setiap elemen path pada gilirannya ...