当执行软链接的“长”列表时,ls -l
显示软链接的文件属性。当执行ls -lL
(或ls -l --dereference
)时,文件属性是链接指向的文件的属性,但ls
仍打印链接本身的名称。该man
页面没有提及任何相关内容。页面info
上ls
只是说“ls
仍然打印链接本身的名称,而不是链接指向的文件的名称。”,没有解释原因。我想这是一个故意的选择,但是有人知道这种行为背后的理由吗ls -L
?
答案1
因为链接另一端的文件名不是(或可能不是)您使用ls
.
显示符号链接目标的名称而不是链接本身的名称有两个问题:
该文件不存在。如果符号链接的目标名称显示在目录列表中,您可能会认为这是该目录中文件的名称,但事实并非如此。目标的名称不是您访问该目录中的文件的名称;具有该文件名的文件不存在(在该目录中),或者,在最坏的情况下,当通过该名称访问时,它可能是完全不同的文件(或目录,或其他)。
文件可能看起来具有相同的名称。如果显示了符号链接的目标名称,那么您可能会发现它与该目录中的另一个文件名完全相同,但这在 Unix 系统上是不可能的。
在这些情况下,这会导致用户感到困惑,他们必须使用ls
without来验证列表-L
,这将使该-L
选项毫无意义。
这 (不是显示目标的名称)也是 POSIX 指定的行为,非常明确:
评估所有符号链接(无论是在命令行上命名还是在文件层次结构中遇到)的文件信息和文件类型,使其成为链接引用的文件的信息和文件类型,而不是链接本身;但是,
ls
应写入链接本身的名称,而不是链接引用的文件。当-L
与 一起使用时-l
,以长格式写入符号链接的内容(请参阅 STDOUT 部分)。
基本原理部分没有对此进行进一步讨论POSIXls
手册。
答案2
-L
当使用或选项时,符号链接保持显示链接名称而不是链接到的文件名的基本原理-H
是一致性。
符号链接和硬链接之间的一个显着区别是,当用 列出时ls -l
,符号链接的权限几乎没有什么用处(除了首字母s
),并且文件名使用约定显示链接名称和链接到的路径名symlink -> target
。此行为的基本原理是,ls -l
无论目标是否存在,该命令都会起作用。它的作用是提供有关符号链接本身的信息。
添加该-L
选项是为了允许类似于硬链接所发生的行为。文件权限是实际的权限,即底层 inode 的权限,文件名是正在查询的权限,而不是其他内容。例如,如果您运行并且显示ls -lL a*
不以 an 开头的文件名,那将会令人困惑。a
而且,如果目标链接不存在,由于没有底层inode,所以没有权限显示,命令ls -lL
会错误失败。
解释为什么这样做的另一个很好的理由是,符号链接通常与相对或绝对路径相关联,而不是与单个文件名相关联,但没有提供使用 来显示相对或完整路径ls -l
,仅显示不带斜杠的纯文件名或点点…