I currently do not understand what is going on when I try to find the contents of or information for a symbolic link to a directory when using the ls
command. I understand there is an option -H
for the ls
command that will follow symbolic links listed on the command line. What the manual page for ls
does not state is that this is only necessary when using the -l
option. If I simply do something like ls symLinkToDir
it will list the linked directories contents with no additional options. But if I do ls -l symLinkToDir
it will only display information about the link UNLESS I include the -H
option as well. This example is what I am talking about:
brian@LinuxBox:~$ ls playground/linkedDir
file4 file5
brian@LinuxBox:~$ ls -l playground/linkedDir
lrwxrwxrwx 1 brian brian 4 Feb 18 16:42 playground/linkedDir -> dir2
brian@LinuxBox:~$ ls -lH playground/linkedDir
total 0
-rw-rw-r-- 1 brian brian 0 Feb 18 16:41 file4
-rw-rw-r-- 1 brian brian 0 Feb 18 16:41 file5
Am I not understanding something here? Is this just a weird way of how it works? If this is indeed how it works, shouldn't the manual page say the symbolic link will be followed under certain conditions without the need for the -H
option? Thanks in advance for your input.
Best Answer
The behavior of
ls
on symbolic links to directories depends on many options, not just-l
and-H
. In the absence of symlink behavior options (-L
,-H
),ls symlinkToDir
displays the contents of the directory, butls -l symlinkToDir
,ls -d symlinkToDir
andls -F symlinkToDir
all display information about the symbolic link.If you're reading the man page of the GNU implementation of
ls
, it doesn't give the full story. GNU man pages are just summaries. The full documentation is in the Info manual (info ls
), usually available in HTML these days. I can't find the default behavior on symlinks to directories in the Info manual either, though, this may be a bug in the documentation.The FreeBSD man page, for example, is more precise, but you have to read the description of the
-H
option to find the default behavior.If you want a more formal description (but less easy to read), read the POSIX specification. This won't have the extensions of your implementation.