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

Nie*_* B. 29 shell bash symlink ln

我正在尝试创建一堆符号链接,但我不明白为什么这是有效的

ln -s /Users/niels/something/foo ~/bin/foo_link
Run Code Online (Sandbox Code Playgroud)

而这

cd /Users/niels/something
ln -s foo ~/bin/foo_link
Run Code Online (Sandbox Code Playgroud)

不是。

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

所以问题是,如何创建一个指向绝对路径的符号链接,而不实际输入它?

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

Ach*_*eas 39

作为绝对路径链接到当前目录的最简单方法是

ln -s "$(pwd)/foo" ~/bin/foo_link
Run Code Online (Sandbox Code Playgroud)

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

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

cd some_directory
ln -s foo foo_link
Run Code Online (Sandbox Code Playgroud)

然后移动那个链接

mv foo_link ../some_other_directory
ls -l ../some_other_directory
Run Code Online (Sandbox Code Playgroud)

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

ln -s ../foo yet_another_link
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,当您通过键入创建链接时

ln -s foo ~/bin/foo_link
Run Code Online (Sandbox Code Playgroud)

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

  • 在 linux (gnu ln) 中,手册页调用第一个参数 `target` 和第二个 `link` (http://man7.org/linux/man-pages/man1/ln.1.html)。但是在 BSD(包括 OS X)中,第一个称为“源”,第二个称为“目标”(https://www.freebsd.org/cgi/man.cgi?ln)。相当混乱。 (3认同)

Ger*_*mia 7

使用-r( --relative) 标志将使这项工作:

ln -sr foo ~/bin/foo_link
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`-r` 是 GNU 主义,即非 POSIX,因此在 OP 情况下不起作用,因为标准的 OS X `ln` 命令是基于 BSD 的。 (4认同)