当执行软链接的“长”列表时,ls -l
显示软链接的文件属性。执行ls -lL
(或ls -l --dereference
) 时,文件属性是链接指向的文件的属性,但ls
仍会打印链接本身的名称。该man
页面对此没有任何说明。在info
对页面ls
只是说,“ls
还是打印链接本身,而不是文件的链接指向的名字的名字。”而没有解释的原因所在。我想这是一个故意的选择,但有没有人知道这种行为背后的基本原理ls -L
?
因为链接另一端的文件名不是(或可能不是)您使用ls
.
显示符号链接的目标名称代替链接本身的名称的两个问题:
该文件不存在。如果符号链接的目标名称显示在目录列表中,您可能会认为这是该目录中文件的名称,但事实并非如此。目标的名称不是您访问该目录中文件的名称;具有该文件名的文件不存在(在该目录中),或者在最坏的情况下,当通过该名称访问时,它可能是一个完全不同的文件(或目录,或其他)。
文件可能看起来具有相同的名称。如果显示符号链接的目标名称,那么您可能会发现它与该目录中的另一个文件名完全相同,这在 Unix 系统上是不可能的。
在这些情况下,这会导致用户混淆,他们必须使用ls
without来验证列表-L
,这会使-L
选项变得毫无意义。
这(不显示目标的名称)也是 POSIX 指定的行为,非常明确:
评估所有符号链接的文件信息和文件类型(无论是在命令行中命名的还是在文件层次结构中遇到的)是链接引用的文件的信息和文件类型,而不是链接本身;但是,
ls
应写入链接本身的名称,而不是链接所引用的文件。当-L
与使用-l
,写在长格式(参见STDOUT部)符号链接的内容。
POSIXls
手册的基本原理部分没有对此进行进一步讨论。