为什么我可以在目标目录中创建符号链接,但不能在源目录中创建?

为什么我可以在目标目录中创建符号链接,但不能在源目录中创建?

假设我有一个目录foo、另一个目录foo/bar,最后有一个文件foo/bar/foobar

怪癖就在于此:

  • 如果我在目录中foo并输入,ln -s bar/foobar .它会创建一个有效的符号链接。
  • 如果我在目录中foo/bar并输入,ln -s foobar ../它会创建指向符号链接本身的符号链接,这会导致其损坏。

我认为它在某种程度上与绝对路径和相对路径相关,因为ln -s "pwd"/specavg_Pr1_ID15_20160201.fits "pwd"/../(实际上并非"如此`,但它存在渲染问题)运行完美。

我不明白的是,如果是cp其他命令,它会按照我的预期执行。但如果不是,就会造成巨大的灾难。这里有什么区别,有没有一个好习惯可以确保我的命令正确引用文件?(不是一直引用完整路径……)

答案1

man 1 ln

符号链接可以保存任意文本;如果稍后解析,则相对链接将根据其父目录进行解释。

当您ln -s foobar ../在 中执行此操作时foo/bar,任意文本为foobar,链接的父目录为../,即foo/。因此,新的foo/foobar符号链接解析foobarfoo并指向其自身。

这个答案

[…] GNU coreutils' ln(>= 8.16) 支持--relative(或-r) 选项,这意味着您可以ln -s使用 2 个绝对或相对(相对于您的工作目录)路径进行调用,它将找出必须写入符号链接的正确相对路径。

如果你ln是 GNUln那么尝试这个foo/bar

ln -sr foobar ../

生成的符号链接将是foobar -> bar/foobar。请注意,生成的任意文本不是您在命令中使用的文本。它是ln -r计算出来的文本。

一般来说(特别是如果你不能使用-rGNU 的ln话),你需要记住符号链接的工作原理:任意文本,相对于其父目录进行解释。如果没有-r任意文本,则逐字逐句地来自相关的命令行参数。

相关内容