我创建了以下文件结构:

test/src
test/firefox


运行此命令时:

ln -s test/src test/firefox


我希望将创建指向test/firefox/src的符号链接test/src,但是我却收到此错误:没有创建指向存储在该文件夹的同级文件夹中的一个文件夹的符号链接?
这是什么意思?


评论

我不确定我会遵循你的所作所为。请发布ls -ld test test / *的输出,或发布用于创建这些文件的确切命令顺序。

mkdir测试; mkdir test / src; mkdir test / firefox; ln -s测试/ src测试/ firefox

使用这些命令,cd test / firefox / src将显示错误cd:没有这样的文件或目录:test / firefox / src,因为test / firefox / src是悬挂的符号链接。您是否正在其他名为src的符号链接上运行cd?

我确信您在ln -s和cd之间做了一些您不告诉我们的事情。假设当前目录中只有一个测试子目录,那么cd src(或您执行的任何内容)应该会引发错误。您在测试/ Firefox中放了什么东西吗?

就像@Gilles给出的提示一样,该链接不会执行您认为的操作。具有相对目标的符号链接始终相对于symlink目录,而不是相对于创建链接的目录。因此,在目录/ some / path中,ln -s test / src test / firefox将创建一个从/ some / path / test / firefox / src指向/ some / path / test / firefox / test / src的符号链接,而不是/ some / path / test / src。

#1 楼

从表面上看,您所建议的对我来说是可行的。 />
$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src


第二次运行通常会产生以下情况:这里。我会怀疑您有一个循环引用,其中的链接指向其自身。

评论


找到-L ./ -mindepth 15揭示了罪魁祸首

–user7610
16-10-13在12:49

当然,它是指向自身的符号链接,或者此链接指向另一个指向自身的链接。我自己已经看过了。在Ubuntu下,当您执行ls -l时,链接将闪烁。所以很难错过。

–周克敏
19/12/11在23:58



#2 楼

正如Dubu在评论中指出的那样,问题出在您的相对路径上。我将nginx配置从/usr/local/etc/nginx链接到/etc/nginx时遇到了类似的问题。如果您这样创建符号链接:
cd /usr/local/etc
ln -s nginx/ /etc/nginx

实际上,您将创建链接/ etc / nginx-> / etc / nginx,因为源路径是相对于链接路径的。解决方案就像使用绝对路径一样简单:
ln -s /usr/local/etc/nginx /etc/nginx

如果要使用相对路径并使它们表现出您可能期望的方式,则可以使用pwd将当前工作目录路径放入,如下所示:
cd /usr/local/etc
ln -s "$(pwd)/nginx/" /etc/nginx

您希望在路径两边加上引号,以确保对当前路径中的空格之类的东西进行转义。请注意,执行此操作时必须使用双引号,因为如果使用单引号,则不会替换$(pwd)

评论


这个答案比另一个答案更清楚。 “使用绝对路径。”

–砜
15年6月17日在16:59

我可以确认这在使用cygwin的Windows上对我有效。谢谢!

– dimiguel
2015年9月28日在16:59

我经常很难正确地论证。在OSX和GNU Linux上,它们相反,这使我更加困惑。

–丹尼尔·W。
16-11-21在13:39

我仍然不敢相信这行得通。

–PNDA
17年1月17日在8:17

您可以使用相对链接,但是它们应基于符号链接所在的目录。换句话说:如果要从符号链接文件所在的目录转到目标目录,则第一个参数应与在cd之后写的参数相同。

–totymedli
18 Mar 14 '15:19



#3 楼

符号链接是相对于链接的父目录,而不是ln进程的当前目录。

执行以下操作时: (其中test/firefox是目录),您正在建立一个test/firefox/src符号链接,该链接的目标是test/src。 />如果您希望符号链接成为test/src的链接,则需要编写:

cd /top/dir
ln -s test/src test/firefox




ln -s ../src test/firefox/


尽管将符号链接指向绝对路径通常不是一个好主意,因为在重命名目录或将文件系统安装到其他位置时,它们很容易断开。使它自己进行计算的选项:

ln -s /top/dir/test/src test/firefox/


#4 楼

使用绝对路径而不是相对路径,它将起作用。

例如:
ln -s /home/user/test/src /home/user/test/firefox


评论


有时候,问题是如此简单。当我意识到我使用了相对路径时,我被困了一段时间,因为符号链接指向自己,因为它具有相同的名称。

–vdegenne
19/12/19在11:35

只是附带说明,您确实可以使用相对路径,我的建议是直接从将要创建目录的目录中生成符号链接。例如cd ./foo,然后是ln -s ../bar bar(此名为bar的符号链接将指向父目录中的bar目录。

–vdegenne
19/12/19在11:44

#5 楼

答案是使用绝对路径。但是为当前目录中的内容键入完整路径可能会很烦人。您可以使用pwd的命令替换来避免这种情况。
如果目标位于当前目录中:

ln -s "$(pwd)"/target abs/path/to/link 


如果链接应位于当前目录中:

ln -s /abs/path/to/target "$(pwd)"


评论


请注意,POSIX外壳对此具有$ PWD特殊变量。与$(pwd)相比,这具有优势,如果当前目录以换行符结尾,它仍然可以工作。请注意,在符号链接的目标中使用相对路径而不是绝对路径通常更好,因为在重命名或移动目录或在其他位置挂载文件系统时,具有绝对路径的路径更容易被破坏。

–StéphaneChazelas
20年7月2日在6:00