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