ln -s具有相对于pwd的路径


26

我正在尝试创建一堆符号链接,但我不知道为什么这行得通

ln -s /Users/niels/something/foo ~/bin/foo_link

而这

cd /Users/niels/something
ln -s foo ~/bin/foo_link

不是。

我相信这与foo_link链接到foo /Users/niels/bin而不是/Users/niels/something

因此,问题是,如何在不实际输入的情况下创建指向绝对路径的符号链接?

作为参考,我使用的是Mac OS X 10.9和Zsh。

Answers:


33

链接到当前目录作为绝对路径而不输入整个路径字符串的最简单方法是

ln -s "$(pwd)/foo" ~/bin/foo_link

该命令的target(第一个)参数ln -s相对于符号链接的位置而不是当前目录起作用。从本质上讲,它有助于创建的符号链接(第二个参数)仅保存您为第一个参数提供的文本

因此,如果您执行以下操作:

cd some_directory
ln -s foo foo_link

然后移动该链接

mv foo_link ../some_other_directory
ls -l ../some_other_directory

您将看到foo_link 尝试指向foo其所在目录的方法。这也适用于指向相对路径的符号链接。如果您执行以下操作:

ln -s ../foo yet_another_link

然后移至yet_another_link另一个目录并检查其指向的位置,您将看到它始终指向../foo。这是预期的行为,因为许多时候符号链接可能是目录结构的一部分,该目录结构可以驻留在各种绝对路径中。

就您而言,当您通过键入以下内容创建链接时

ln -s foo ~/bin/foo_link

foo_link只是持有foo相对于其位置的链接。将$(pwd)目标参数的名称放在前面仅会添加当前工作目录的绝对路径,以便使用绝对目标创建链接。


“ ...有助于想象所创建的符号链接仅包含文本。...” 这不是字面意思吗?
通配符

1
它是。也许我可以将想象变成“了解”或“理解”。
Achilleas

也许我再次感到困惑。在您说“目标”的地方,似乎是“来源”。该source_file(第一)的说法是该链接指向哪里,这是逐字你在命令中输入的内容。该target_file(第二)参数变成链路的名称,除非你进入的是一个目录,在这种情况下,链接名称相同的基本名称source_file,但放在该目录target_file
Charlie Gorichanaz

Y̶o̶u̶'̶r̶e̶权,̶̶t̶h̶e̶r̶e̶'̶s̶一个错误在̶a̶n̶s̶w̶e̶r̶.̶疯狂如何仍然不会陷入̶s̶o̶o̶n̶e̶r̶.̶̶F̶i̶x̶i̶n̶g̶.̶不,答案是正确的。由ln手册页,target是第一个参数(其中链接指向),而第二个参数被简称为linksource没有提及)。
Achilleas

3
在linux(gnu ln)中,手册页调用第一个参数target,第二个参数linkman7.org/linux/man-pages/man1/ln.1.html)。但是在BSD(包括OS X)中,第一个被调用source,第二个被调用targetfreebsd.org/cgi/man.cgi?ln)。相当混乱。
cristoper

5

使用-r--relative)标志将完成以下工作:

ln -sr foo ~/bin/foo_link

4
请注意,这-r是GNUism,即非POSIX,因此在OP情况下将不起作用,因为标准OS X ln命令基于BSD。
jlliagre

2

要保存一些输入内容,您可以

ln -s "$PWD"/foo ~/bin/foo_link

@Freddy,这取决于外壳。在fish或zsh中,就可以了。在包括bash且默认值为$ IFS的类似Bourne的shell中,SPC确实是一个问题,但是TAB,NL和所有通配符(至少*?[...])也是一个问题。
StéphaneChazelas

@StéphaneChazelas是的,您是对的,并且该问题带有标记bash,因此引用它通常是一个好主意。不好,我应该更具体一些。
弗雷迪

0

怎么样:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link

1
不,不会成功的。
Niels B.
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.