假设我有一个目录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
符号链接解析foobar
为foo
并指向其自身。
看这个答案:
[…] GNU coreutils'
ln
(>= 8.16) 支持--relative
(或-r
) 选项,这意味着您可以ln -s
使用 2 个绝对或相对(相对于您的工作目录)路径进行调用,它将找出必须写入符号链接的正确相对路径。
如果你ln
是 GNUln
那么尝试这个foo/bar
:
ln -sr foobar ../
生成的符号链接将是foobar -> bar/foobar
。请注意,生成的任意文本不是您在命令中使用的文本。它是ln -r
计算出来的文本。
一般来说(特别是如果你不能使用-r
GNU 的ln
话),你需要记住符号链接的工作原理:任意文本,相对于其父目录进行解释。如果没有-r
任意文本,则逐字逐句地来自相关的命令行参数。