Symlinks are used because of two reasons:
It barely uses space on the hard disk. On filesystems where the metadata are reserved during creation (e.g., the ext2/3/4 family), symlinks is wholly contained as an inode
in the filesystem metadata table.
It's completely transparent. See explanation below:
Let's say I in /etc
I created a symlink varlink
pointing to /var
. With symlinks, I can do cd /etc/varlink/lib
. If I then do an ls
, I would see the contents of /var/lib
(that is, the "/etc/varlink
" part is 'replaced' with "/var
"). I can go deeper to /etc/varlink/lib/dbus
, in which I will see the contents of /var/lib/dbus
. Yet, even though what I'm seeing is actually the contents of the latter, the $CWD
(Current Working Directory) is still the former.
Similarly when symlinks are against files. Let's say that /etc/fstab
is a symlink to /opt/fstab
. I can do all operation against /etc/fstab
(e.g., cat
the contents, or perform sed
against its contents) without having to first decode it to find the actual file it's symlinking to. The filesystem behind the scenes will take care of I/O redirection to the actual file.
And the answer to the second question: I don't think that is possible at all. At least, not via the shell.
Within a GUI, however, it is possible to have a program handle Windows' ".lnk" files, to redirect the file browser to somewhere else. But I'm not sure if such program is ever made.