我可以做这个:
$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt
但我希望能够做到这一点:
$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
这可能吗?我可以以某种方式解析相对路径名并将其传递给吗ln
?
答案1
如果您创建到相对路径的符号链接,它会将其存储为相对符号链接,而不是像示例所示的绝对符号链接。这通常是一件好事。当文件系统安装在其他地方时,绝对符号链接不起作用。
您的示例不起作用的原因是它相对于符号链接的父目录而不是ln
运行位置。
你可以做:
$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
或者对于这一点来说:
$ cd foo
$ ln -s foo/bar.txt ../bar.txt
重要的是要认识到后面的第一个参数ln -s
被存储为符号链接的目标。它可以是任意字符串(唯一的限制是它不能为空且不能包含 NUL 字符),但在使用和解析符号链接时,该字符串被理解为相对路径符号链接的父目录(当它不以 开头时/
)。
答案2
如果您使用较新的 coreutils(我使用的是 coreutils-8.22-11),它有一个选项可以执行此操作:
ln --help | grep relative
can hold arbitrary text; if later resolved, a relative link is
-r, --relative create symbolic links relative to link location
例如:
$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
lrwxrwxrwx 1 ptr ptr 4 aug 25 17.02 /tmp/test/to -> from
答案3
抱歉,没有。符号链接与链接所在的位置相关,而不是与创建链接时所在的位置相关。这种行为有几个很好的原因,其中大多数涉及挂载远程文件系统。
答案4
由于最常见的 shell 扩展路径,要创建相对符号链接,您应该引用“源路径”。
另外,-s
参数的意思是--symbolic
.ln
默认创建硬链接。
$ ln -s '../../relative_path' path
$ ls -al path
lrwxrwxrwx 1 empjustine empjustine 19 Aug 6 01:38 path -> ../../relative/path