..
é uma entrada de diretório no diretório atual. É um hardlink para o diretório um nível acima. /base/symlink/..
é na verdade o mesmo arquivo que /some_other_dir/..
, e é /
(a menos que some_other_dir
seja também um link simbólico para algum outro lugar).
Na maioria dos shells, cd
trata ..
especialmente, em vez de tratá-la como a entrada de diretório ..
, ocorrências de ..
são interpretadas por cd
(e não pela resolução do nome do caminho do sistema) como remover um nível de diretório.
Como exemplo, em cd a/b/..
, o shell faz um chdir("a")
em vez de fazer um chdir("a/b/..")
. Para obter o último, você precisa fazer cd -P a/b/..
.
É importante perceber que isso se aplica apenas a cd
(e somente em alguns shells), (IMO, uma má qualidade), não a ls
ou vi
ou qualquer outra coisa ( a menos que qualquer outra coisa seja um script escrito com esses shells).
Nos shells em que cd
faz a interpretação lógica de ..
, a variável pwd
e a variável $PWD
contêm o diretório atual lógico do real (físico), que é um com possivelmente componentes de diretório symlink. Da mesma forma, você pode usar pwd -P
para obter o diretório de trabalho físico .
Agora, se você quiser fazer
cd /A/b
anything-but-cd ../c
E realmente significa:
anything-but-cd /A/c
Independentemente de o /A/b
ser um link simbólico ou não, você pode fazer isso:
anything-but-cd "$(dirname -- "$PWD")/c"
ou
anything-but-cd "${PWD%/*}/c"