为什么“ls -L”打印链接本身的名称,而不是链接指向的文件的名称?

为什么“ls -L”打印链接本身的名称,而不是链接指向的文件的名称?

当执行软链接的“长”列表时,ls -l显示软链接的文件属性。当执行ls -lL(或ls -l --dereference)时,文件属性是链接指向的文件的属性,但ls仍打印链接本身的名称。该man页面没有提及任何相关内容。页面infols只是说“ls仍然打印链接本身的名称,而不是链接指向的文件的名称。”,没有解释原因。我想这是一个故意的选择,但是有人知道这种行为背后的理由吗ls -L

答案1

因为链接另一端的文件名不是(或可能不是)您使用ls.

显示符号链接目标的名称而不是链接本身的名称有两个问题:

  1. 该文件不存在。如果符号链接的目标名称显示在目录列表中,您可能会认为这是该目录中文件的名称,但事实并非如此。目标的名称不是您访问该目录中的文件的名称;具有该文件名的文件不存在(在该目录中),或者,在最坏的情况下,当通过该名称访问时,它可能是完全不同的文件(或目录,或其他)。

  2. 文件可能看起来具有相同的名称。如果显示了符号链接的目标名称,那么您可能会发现它与该目录中的另一个文件名完全相同,但这在 Unix 系统上是不可能的。

在这些情况下,这会导致用户感到困惑,他们必须使用lswithout来验证列表-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,仅显示不带斜杠的纯文件名或点点…

相关内容