使用带符号链接的 ls 命令

使用带符号链接的 ls 命令

目前,当我尝试使用该命令查找目录符号链接的内容或信息时,我不明白发生了什么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 symlinkToDirls -d symlinkToDirls -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 应写入目录中包含的文件的名称以及任何请求的关联信息。

我只能假设它在那里,因为如果没有-For -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@

相关内容