硬链接到软链接

硬链接到软链接

可以强制ln在第一个参数中不遵循软链接吗?例如,在下面我想hard成为一个硬链接到软链接soft:

$ mkdir dir
$ ln -s dir soft
$ ln soft hard
ln: soft: Is a directory

我知道ln -h,但这只会阻止ln跟踪中的软链接第二争论。

答案1

默认情况下,在您的系统上,ln如果源是符号链接,则完全解析源。有一个标准选项-P,可以防止它执行此操作:

$ mkdir dir
$ ln -s dir soft
$ ls -l
total 4
drwxr-xr-x  2 myself  wheel  512 Sep 21 22:39 dir
lrwxr-xr-x  1 myself  wheel    3 Sep 21 22:39 soft -> dir
$ ln -P soft hard
$ ls -il
total 4
129605 drwxr-xr-x  2 myself  wheel  512 Sep 21 22:39 dir
129606 lrwxr-xr-x  2 myself  wheel    3 Sep 21 22:39 hard -> dir
129606 lrwxr-xr-x  2 myself  wheel    3 Sep 21 22:39 soft -> dir

ln该实用程序的 POSIX 规范说:

如果 source_file 是符号链接:

如果该-P选项有效,则应执行linkat()source_file以 为path1参数、以目标路径为参数path2AT_FDCWDfd1和 为fd2参数、以零为flag参数的函数等效的操作。

linkat()除非你知道这是什么,否则这篇文章大部分都是乱码。OpenBSD 手册将其翻译为

-P

创建硬链接且源是符号链接时,链接到符号链接本身。该-P选项将覆盖之前的任何-L选项。

... 和GNU 手册

-P
--physical

如果-s未生效,并且源文件是符号链接,则创建到符号链接本身的硬链接。在内核不支持的平台上,此选项创建具有相同内容的符号链接;由于无法编辑符号链接内容,因此通过任一链接执行的任何文件名解析都将与创建硬链接相同。


有趣的是,(Ubuntu) Linux 上的 GNUln手册中有这样的内容:

使用-s忽略-L-P.否则,当 aTARGET是符号链接时,指定的最后一个选项控制行为,默认为-P

而在 OpenBSD 和 macOS 上(大概还有其他系统),同一份 GNUln手册说

使用-s忽略-L-P.否则,当 aTARGET是符号链接时,指定的最后一个选项控制行为,默认为-L

(始终阅读您正在使用的系统上的手册而不是在互联网上的某个随机页面上阅读手册的另一个原因,这种情况似乎经常发生。)

相关内容