Eu suponho que sua pergunta é como o bash pode saber mudar o diretório para que o diretório de trabalho seja foo
(em vez de foo/bar/..
) em cd foo/bar/..
.
Embora esses dois caminhos sejam representados pelo mesmo inode (a menos que haja links simbólicos presentes no caminho, conforme mostrado no final desta resposta), o shell precisa tomar medidas especiais para mostrar o nome do diretório atual como foo
, em vez de ..
. Em bash
, quando cd
encontra ..
no caminho, internamente apenas retira o diretório pai, significando que ..
nunca pode ser o nome do diretório.
Isso está documentado em help cd
:
..
is processed by removing the immediately previous pathname component back to a slash or the beginning of DIR.
Esse caso especial resulta no seguinte comportamento interessante (observe que foo/qux/..
ainda foi resolvido para foo
, mesmo quando o caminho real era bar/baz/..
):
$ tree
.
|-- bar
| '-- baz
'-- foo
3 directories, 0 files
$ ln -s "$(readlink -f bar/baz)" foo/qux
$ tree
.
|-- bar
| '-- baz
'-- foo
'-- qux -> bar/baz
4 directories, 0 files
$ cd foo/qux/..
$ basename "$(pwd)"
foo