symlink的目标相对于目标的父目录是否相对?为什么?


14

我有以下文件结构:

build/
client/
  –> index.js

当我尝试在构建目录中创建一个名为“ client”的符号链接时,该链接指向cwd中的客户端目录,如下所示

// Fails
$ pwd
/home/user/
$ ln -s client build/client 
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links

我收到上面显示的ELOOP错误。当我将目标路径更改为相对于目标路径时,一切都很好:

// Works
$ pwd
/home/user/
$ ln -s ../client build/client 
$ stat build/client/index.js
stat: <outputs file stats>

这是预期的行为,请解释原因...


这可能与使用../使用绝对路径声明路径而不是相对路径有关。一个好的做法是始终使用绝对路径
Kiwy 2013年

我同意最佳做法,因为我一直对目标和目的地都使用绝对路径。但是,手册页指出相对路径可以同时用于...
jibsales 2013年

Answers:


13

对于无效的代码,如果查看ls -l结果,则会得到以下结果:

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

现在了解这里发生了什么。让我们看一下您调用的命令:

ln -s client build/client

根据手册页,此格式有两种可能的匹配项

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
       ln [OPTION]... TARGET... DIRECTORY     (3rd form)

它将与第一种形式匹配(自第一种形式开始)。现在,“目标名称”或client您的情况可以是(根据完整的ln手册)任意字符串。他们不必立即解决任何问题,但可以将来解决。您通过调用创建的内容是一个“悬挂的符号链接”,系统不会阻止您创建这些符号链接。

现在,您的第二次调用ln -s ../client build/client是所谓的“相对符号链接”(如您在自己的文章中所述)。还有第二种类型,这是一个“绝对符号链接”,可以通过do来调用ln -s /home/user/client build/client

不是错误。根据手册规定:

在与当前目录不同的位置创建相对符号链接时,符号链接的分辨率将不同于当前目录中相同字符串的分辨率。因此,许多用户更喜欢先将目录更改为将创建相对符号链接的位置,以便制表符完成或其他文件解析将找到与放置在符号链接中相同的目标。

-来自 info coreutils 'ln invocation'

也就是说,您必须使用到目标的相对或绝对路径。


5

这确实是预期的行为。从ln(1)手册页:

符号链接可以包含任意文本;如果以后解析,则会相对于其父目录解释相对链接。

至于原因,想象一下符号链接是相对于其源而不是目的地来解释的。在以后解决它时,您将需要知道创建它时的CWD是什么,这是荒谬的,更不用说不可能了。

而且,通过这种方式,您可以得到一种简洁而紧凑的方法来创建框架目录结构,该结构可以将其放置在目录树中的任何位置而不会破坏符号链接。

举一个我的意思的例子,假设您正在一个项目上,并且已经为它设置了一个完整的目录结构,如下所示:

$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/

现在,假设您要创建一个widgets/内部符号链接wizardry/。您有两种选择:

$ ln -s /home/you/project/widgets /home/you/project/wizardry

要么

$ ln -s ../widgets /home/you/project/wizardry

如果您随后尝试将其移动到/home/you/project其他任何地方,则使用第一种形式创建的符号链接将会中断,因为它正在寻找/home/you/project/widgets。第二种形式将保持符号链接的功能,因为它是在../widgets 相对于其所在的位置进行查找,而不管该位置在目录树中的位置如何。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.