No zsh, há um modificador para isso, ou melhor, dois: A
para resolver links simbólicos (com realpath ) e h
para extrair a “cabeça” (isto é, o dirname
).
cd $file(:A:h)
Isso só funciona se o simbólico não estiver quebrado. Se houver uma cadeia de links simbólicos, ela será seguida até o destino final. Se o diretório foi alcançado por meio de um link simbólico, você estará em seu destino (como em cd -P
).
Sem zsh, se você tiver o utilitário readlink
e quiser mudar para o diretório que contém o destino do link simbólico:
cd -- "$(dirname -- "$(readlink -- "$file")")"
O destino do link pode ser um link simbólico. Se você quiser mudar para o diretório que contém o destino final do link, você pode chamar readlink
em um loop:
while [ -L "$file" ]; do
target=$(readlink -- "$file")
while case $target in */) target=${target%/};; *) false;; esac; done
case $target in
*/*) cd -- "${target%/*}"; target=${target#**/};;
esac
done
No Linux, supondo que o link simbólico não está quebrado, você pode usar readlink -f
para canonicalizar o caminho:
t=$(readlink -f -- "$file")
cd "${t%/*}"