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:
-Lforce symbolic links to be followed: resolve symbolic links in DIR after processing instances of..-Puse 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-Lwere 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 () run their content in a subshell; this is the trick: the cd command affects this subshell only and in your main shell nothing changes, there's no need to cd back.