Do you know cd ? I thought I did until this afternoon …
OK, let’s start some basic.
I create two directories
$ echo $SHELL /bin/ksh $ mkdir /tmp/foo $ mkdir /tmp/bar
create a symlink /tmp/bar/baz pointing to /tmp/foo
$ ln -s /tmp/foo /tmp/bar/baz
create a file foo1 in foo
$ touch /tmp/foo/foo1
change to the symbolic link baz
$ cd /tmp/bar/baz
Ok, so far so good. Let’s check what is in ../foo
$ ls ../foo foo1
From the symbolic baz, .. point to /tmp/foo. This is because ls and most command line utilities use the physical path.
To print the Logical [default] and Physical working directories, use pwd -L and pwd -P
$ pwd -L /tmp/bar/baz $ pwd -P /tmp/foo
to change directory relatively to the logical path, use cd -L … (default), for physical, use cd -P … !
$ pwd -L /tmp/bar/baz $ cd -L ../foo ksh: ../foo: not found
Obviously /tmp/bar/foo does not exist
$ pwd -L /tmp/bar/baz $ pwd -P /tmp/foo $ cd -P ../foo $ pwd /tmp/foo
Obviously /tmp/foo/../foo is /tmp/foo
So far so good, some of you may know that already.
Let’s bring some devil element in play
Arghh!!! Ôôôôôôôôôôôôôô râge, Ôôôôôôôôôôôôôô désespoir, I switched to a non-working shell!
$ cd /tmp/bar/baz $ cd -L ../foo $ pwd -L /tmp/foo
Even if I switched to a not working directory, bash cd -L weirdly decided to switch to the physical path instead of the logical path.
$ cd /tmp/bar/baz $ mkdir /tmp/bar/foo $ cd -L ../foo $ pwd /tmp/bar/foo
This time bash cd -L changed to the logical path. So if you use bash and cd, you cannot possibly know where you are landing without checking first if the directory exist !
BTW, I just discovered Digger HD , unrelated to this post of course …