我想创建一个指向当前工作目录中的文件的符号链接。
假设我有一个顶级树,如下所示:
.
├── dir1
│ └── hello.so
└── dir2
2 directories, 1 file
我将工作目录更改为dir1
.现在,我想创建hello.so
in的符号链接dir2
。
我尝试一下ln -s ./hello.so ../dir2/
。但是,这不起作用,因为它创建了到 的链接,而不是按照我的预期 ./hello.so
扩展。./
ln -s ${PWD}/hello.so ../dir2/
工作正常,但有点冗长。
我担心我可能误解了./
扩展是什么,但我一直无法弄清楚我错在哪里。
如果这是我的环境特有的问题,我使用的是 Bash 5.0.2。我没能在这个ln
人身上找到任何花哨的标志。
答案1
./
不是扩展,它是字面相对路径:查找.
当前目录中调用的条目,将其视为目录 ( /
),然后从那里继续hello.so
在其中查找。
每个目录都有一个.
指向自身的条目。每个目录还有一个..
指向其父目录(根目录除外)的条目。这些并不是特别特别:它们是普通的目录条目,就像常规文件和目录一样,只是它们是自动创建的。
符号链接存储一个文字它们内部的字符串值,并ln -s
准确存储您赋予它的值,而不进行任何处理。这就是您看到的结果:./hello.so
完全按照您的指示放入链接中。
如果您希望链接中包含完整路径,则需要提供完整路径,无论是直接$PWD
写出$(pwd)
还是直接写出。
但是,路径是相对于位置进行解释的,因此这将是该文件的有效链接:
ln -s ../dir1/hello.so dir2/hello.so
或任何其他您想要链接的位置的路径 -../dir1/hello.so
都将以相同的方式存储在链接中。
在这种情况下,当访问链接时,../dir1/hello.so
将相对于链接所在位置进行查找,并且它将找到您的文件。如果移动整个目录树,则这是稳健的,而绝对路径则不然。根据您想要实现的目标,其中任何一个都可能是适合您的选择。
答案2
从dir1
:
ln -s ../dir1/hello.so ../dir2
从dir2
:
ln -s ../dir1/hello.so .
(这里最后一个点是可选的)
从顶层目录:
ln -s ../dir1/hello.so dir2
第一个参数是符号链接本身的“内容”(所谓的来源在手册中)。在这种情况下,它使用文件所在位置的相对路径指向该文件。第二个参数是符号链接应该放置的位置。