8
$ cd ~
$ ln -s /real/folder symbolic_link

$ cd symbolic_link
$ cd ..
$ ls -l
symbolic_link -> /real/folder/

$ cd symbolic_link
$ ls -l ..
folder

In other words, why the behaviour of cd .. is different from ls .. when you are inside a symbolic linked directory?

1 Answers1

7

Your shell tracks the symbolic links that led you to your current working directory. cd is a shell builtin and help cd states (example from bash):

Options:
-L force symbolic links to be followed: resolve symbolic links in DIR after processing instances of ..
-P use the physical directory structure without following symbolic links: resolve symbolic links in DIR before processing instances of ..
[…]
The default is to follow symbolic links, as if -L were specified.

You can try cd -P .. and see the difference. Another example is pwd -L and pwd -P (while pwd is also a shell builtin).

Note the default behavior can be changed by set -P and set +P. See help set for more details.

On the other hand ls is a separate executable that doesn't benefit from this tracking ability of your shell. However you can make it follow symbolic links with this trick:

(cd -L .. && ls -l)

Basically we use cd to change the current working directory with respect to symbolic links (and I explicitly used the default -L option for that), then invoke ls -l. The && operator means ls will be executed only if cd succeeds. Parentheses () make all that is inside be executed in a subshell. This is the trick: cd command affects this subshell only and in your main shell nothing changes, there's no need to cd back.