如果循环符号链接没有用,那么为什么允许它们呢?

If circular symlinks are useless, then why are they allowed?

我刚在这里 post 阅读这篇文章:

What are circular symlinks in Unix-like systems used for?

答案很有趣。他们似乎断定地说,没有理由创建这样一个循环符号链接,因此它一定是错误创建的。如果这是真的,那么到底为什么允许他们这样做呢?是因为禁止它们的机制过于复杂或计算量大吗?

我不明白为什么会这样:我们不能只比较内存中的地址,看它是否与目标地址相同,如果相同,则抛出错误?

编辑:除非您使用某种强制选项,否则在某些语言中可能会出现错误。在这些情况下,那么我的问题就变成了:为什么要允许强制选项?

编辑:在@Wumpus Q Wembley 的帮助下进一步研究后,看来这在 unix 中确实是不允许的,并导致以下错误:

ln: ‘/usr/bin/apt-config’ and ‘/usr/bin/apt-config’ are the same file

但是当被符号链接到自身的文件已经是来自其他文件的符号链接时,这确实会发生。我不确定为什么这种行为是可取的?

-保罗

检测到符号link在创建时会指向自身并不是特别困难,但这不会阻止它们以其他方式创建。考虑:

mkdir foo
cd foo
ln -s ../bar/example example
cd ..
mv foo bar

防止 that 需要在重命名目录之前,OS 将扫描其内容(包括子目录)检查每个 link 的目标.太贵了。

如果 symlink 的目标路径包含许多其他 symlink 或一些慢速网络文件系统,即使在创建时进行检查也可能代价高昂。

基本上,这不值得麻烦。自引用 symlinks 没有用,但它们也不是真的有害。

我知道(并使用过)一个循环符号链接很有用的案例。这是一个极端案例,但尽管如此。

有问题的符号链接位于 /boot 目录中,并且(循环地)指向自身,如:

boot -> ./

它是使用以下命令创建的:

ln -s . boot

需要它的原因如下:

当我设置各种 Linux 系统时,在某些情况下我使用单独的 /boot 分区,而在某些情况下我不使用。

我有一个千篇一律的 grub.cfg 文件,内容如下:

menuentry "Gentoo GNU/Linux" {
    echo "Loading Linux kernel"
    linux /boot/vmlinuz root=...
    echo "Loading initial ramdisk"
    initrd /boot/initramfs
}

如果我没有符号链接,以上内容将不适用于具有单独 /boot 分区的系统。对于那些系统,我需要:

menuentry "Gentoo GNU/Linux" {
    echo "Loading Linux kernel"
    linux /vmlinuz root=...
    echo "Loading initial ramdisk"
    initrd /initramfs
}

注意 /vmlinuz/initramfs 前面没有 /boot

原因是 /boot 分区是 root 分区 GRUBvmlinuzinitramfs 位于 root / 目录中。

然而,对于没有单独 /boot 分区的系统,系统/ 分区也是 GRUB 的根分区vmlinuzinitramfs 位于 /boot 目录中。

有了符号链接,我可以对两种类型的系统使用相同的 grub.cfg