目前,当我尝试使用该命令查找目录符号链接的内容或信息时,我不明白发生了什么ls
。我知道-H
该命令有一个选项ls
将遵循命令行上列出的符号链接。手册页ls
没有说明的是,只有在使用该选项时才需要这样做-l
。如果我只是做类似的ls symLinkToDir
事情将要列出链接目录内容,无需其他选项。但如果我这样做,ls -l symLinkToDir
它只会显示有关链接的信息,除非我-H
也包含该选项。这个例子就是我要说的:
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
我在这里不明白什么吗?这只是一种奇怪的工作方式吗?如果这确实是它的工作原理,那么手册页不应该说在某些条件下将遵循符号链接而不需要该-H
选项吗?预先感谢您的意见。
答案1
on 目录符号链接的行为ls
取决于许多选项,而不仅仅是-l
和-H
。如果没有符号链接行为选项 ( -L
、-H
),ls symlinkToDir
则显示目录的内容,但ls -l symlinkToDir
、ls -d symlinkToDir
和ls -F symlinkToDir
全部显示有关符号链接的信息。
如果您正在阅读 的 GNU 实现的手册页ls
,它并没有给出完整的故事。 GNU 手册页只是摘要。完整的文档位于信息手册 ( info ls
) 中,目前通常以 HTML 形式提供。我也无法在信息手册中找到目录符号链接的默认行为,但这可能是文档中的错误。
这FreeBSD 手册页例如,更精确,但您必须阅读-H
选项的说明才能找到默认行为。
-H
遵循命令行上的符号链接。如果未指定-F
、-d
或选项,则假定此选项-l
。
如果您想要更正式的描述(但不太容易阅读),请阅读POSIX规范。这不会有您的实施的扩展。
如果指定了一个或多个 -d、-F 或 -l 选项,并且未指定 -H 和 -L 选项,则对于命名目录符号链接类型文件的每个操作数,ls 应写入文件的名称以及任何请求的相关信息。如果未指定 -d、-F 或 -l 选项,或者指定了 -H 或 -L 选项,则对于命名目录符号链接类型文件的每个操作数,ls 应写入文件名包含在目录中以及任何请求的相关信息。
答案2
显然这是POSIX 要求:
如果没有一个-d,-F, 或者-l指定选项,或者-H或者-L选项已指定,对于命名目录符号链接类型文件的每个操作数,ls 应写入目录中包含的文件的名称以及任何请求的关联信息。
我只能假设它在那里,因为如果没有-F
or -l
,到目录的链接看起来就像一个实际的目录,因此ls $link_to_dir
也可能与 相同ls $dir
。
当link
指向 时dir
,目录和链接在列表中看起来是一样的,并且在命令行上使用时它们的行为相同:
$ ls
dir link
$ ls dir
bar foo
$ ls link
bar foo
但-F
揭示了差异:
$ ls -F
dir/ link@
$ ls -F dir
bar foo
$ ls -F link
link@