从 coreutils 手册中,对于ln
在与当前目录不同的位置创建相对符号链接时,符号链接的分辨率将不同于当前目录中相同字符串的解析。因此,许多用户更喜欢首先将目录更改为将创建相对符号链接的位置,以便 制表符补全或其他文件解析将找到与符号链接中放置的目标相同的目标。
存储在相对符号链接中的字符串完全由源路径名和目标路径名确定,两者都指定为 的命令行参数ln
。
我不明白当前目录是如何参与的。所以我不太明白为什么许多用户喜欢在创建之前将当前目录更改为要创建的相对符号链接的父目录。你能重新表述一下或者举一些例子吗?谢谢。
答案1
有两件事要记住:
ln -s
(不带-r
)存储目标名称当你将它传递给它时- 如果你传递了一个相对目标,它就会解析相对于链接名称,不是你当前的工作目录
例子:
我已经加入/home/user/d0
并且想要一个链接,/home/user/file
所以我这样做:
ln -s ../file .
../file
是来自 的有效路径d0
。
现在,如果有一个子目录d1
( /home/user/d0/d1
) 并且我想在不更改目录的情况下放置一个到../file
( /home/user/file
) 的链接,我需要这样做:
ln -s ../../file d1/
因为相对路径需要是相对于链接名称,不是我当前的工作目录。../../file
(可能)解析为与 相关的任何内容d0
(除非有一个名为 的文件/home/file
),因此我不会获得它的自动完成功能,这可能会使操作更容易出错。
所以我改为d1
第一个:
cd d1
ln -s ../../file .
现在../../file
相对于当前目录和链接名称都有意义;自动完成功能启动,我确信我的名字是正确的。
GNUln
有一个--relative|-r
标志,它使您不必手动编写这些相对路径,从而使这变得更容易。有了它,您可以使用相对于当前目录的路径或绝对路径,并且它将相对于链接名称相对化(根据需要)。
答案2
如果你这样做了
mkdir /tmp/foo
ln -s ../../etc/passwd /tmp/foo
然后访问/tmp/foo/passwd
将转换为/tmp/foo/../../etc/passwd
- 即/etc/passwd
如果你这样做了
mkdir /var/tmp/foo
ln -s ../../etc/passwd /var/tmp/foo
然后访问/var/tmp/foo/passwd
将转换为/var/tmp/foo/../../etc/passwd
- 即/var/etc/passwd
因此,您可以看到“相对符号链接路径”的解析方式有所不同,具体取决于链接的保存位置。您运行命令的当前目录ln
根本不涉及。
为了避免这种混乱,一些用户会在创建符号链接之前更改其当前目录
mkdir /tmp/foo
cd /tmp/foo
ln -s ../../etc/passwd
答案3
你是完全正确的。符号链接中的内容正是命令中指定的内容。但手册试图说,符号链接将相对于链接的位置进行解释,因此用户应注意正确建立链接。
举个例子:
/tmp/test$ mkdir bar
/tmp/test$ ls -l foo/aaa
-rw-r--r-- 1 itvirta itvirta 0 Jul 4 00:37 foo/aaa
/tmp/test$ ln -si foo/aaa bar/
该文件就在那里,就在我们认为的位置,因此人们可能会认为该链接现在可以工作。但事实并非如此,因为链接是相对于其位置来解释的,而不是相对于我创建它时所在的位置。
/tmp/test$ cat bar/aaa
cat: bar/aaa: No such file or directory
如果我在创建链接之前转到目标目录,我肯定不会感到困惑:
/tmp/test$ cd bar
/tmp/test/bar$ ls -l ../foo/aaa
-rw-r--r-- 1 itvirta itvirta 0 Jul 4 00:37 ../foo/aaa
/tmp/test/bar$ ln -si ../foo/aaa .
然而,更令人困惑的是,在创建硬链接时,指向目标文件的方式正是创建符号链接时不起作用的明显方式:
/tmp/test$ ln foo/aaa bar/
这里提醒一下,因为符号链接是按名称指向的,而不是像几乎所有其他操作那样按文件标识(inode)指向。移动到目标目录首先会对齐这两种情况,并减少人为失误的机会。
答案4
当您键入时,ln -sT abc/fgh mno/xyz
它将存储abc/fgh
在新文件 mno/xyz 中,并设置链接位。当您查看时,mno/xyz
您实际上会查看mno/abc/fgh
。这并不重要(正如您所说)您创建或使用链接时所在的目录。
然而:
他们将目录更改为将创建相对符号链接的位置,以便他们创建它时的观点与使用它时的观点相同。这减少了混乱。此外,当使用制表符补全时,它会变得更容易,因为否则制表符补全将无法工作。