Dado um nome de caminho canônico, como o seu, isso funcionará:
set -f --; IFS=/
for p in $pathname
do [ -e "$*/$p" ] || break
set -- "$@" "$p"
done; printf %s\n "$*"
Isso imprime pelo último componente totalmente existente / acessível de $pathname
e coloca cada um deles separadamente no array arg. O primeiro componente inexistente não é impresso, mas é salvo em $p
.
Você pode abordá-lo de forma oposta:
until cd -- "$path" && cd -
do case $path in
(*[!/]/*)
path="${path%/*}"
;; (*) ! break
esac
done 2>/dev/null && cd -
Isso retornará adequadamente ou reduzirá $path
, conforme necessário. Ele se recusa a tentar uma alteração para /
, mas se for bem-sucedida, imprimirá seu diretório de trabalho atual e o diretório para o qual ele será alterado para stdout. Seu $PWD
atual também será colocado em $OLDPWD
.