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

twa*_*163 4 ls symlink

当执行软链接的“长”列表时,ls -l显示软链接的文件属性。执行ls -lL(或ls -l --dereference) 时,文件属性是链接指向的文件的属性,但ls仍会打印链接本身的名称。该man页面对此没有任何说明。在info对页面ls只是说,“ls还是打印链接本身,而不是文件的链接指向的名字的名字。”而没有解释的原因所在。我想这是一个故意的选择,但有没有人知道这种行为背后的基本原理ls -L

Kus*_*nda 8

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

显示符号链接的目标名称代替链接本身的名称的两个问题:

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

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

在这些情况下,这会导致用户混淆,他们必须使用lswithout来验证列表-L,这会使-L选项变得毫无意义。

这(显示目标的名称)也是 POSIX 指定的行为,非常明确:

评估所有符号链接的文件信息和文件类型(无论是在命令行中命名的还是在文件层次结构中遇到的)是链接引用的文件的信息和文件类型,而不是链接本身;但是,ls应写入链接本身的名称,而不是链接所引用的文件。当-L与使用-l,写在长格式(参见STDOUT部)符号链接的内容。

POSIXls手册的基本原理部分没有对此进行进一步讨论。