Linux链接文件造成的绝对路径问题
前几天老师在课上遇到了一个绝对路径的bug,最后发现是和链接文件有关。我觉得很有意思,特意来复现了一下。这复现过程可真是难受死了,好了,话不多说,下面是我复现的过程。
第一步
首先打开我们的terminal终端,默认是进入了 /home/windear
目录。我们在这个目录下新建一个 newfile
文件,其内容是 This is a file.
因为我看了一下自己文件里好像并没有链接到目录的文件,所以自己要来创建链接文件。
第二步
我们移动到 /
目录处,然后执行 mkdir -p targetdir/subdir
来创建一个二级目录。从字面我们可以看到,我们要链接到的目录就和其有关。
第三步
然后我们执行 ln -s /targetdir/subdir /linkdir
来在 /
目录下创建一个链接文件 linkdir
链接到 /targetdir/subdir
。我们使用 ls -l
查看,发现最后的确是链接成功了。说到这步可真是心酸死了,俩文件位置写反了,换了好几个环境才发现,花了我大把大把的时间啊。
第四步
- 现在就是复现bug的时候了。我们首先cd进入此链接文件,然后使用绝对路径看看
newfile
的内容,这样毫无疑问可以看到。 - 然后我们使用相对路径
cat ../home/windear/newfile
来看,怎么会提示看不到了呢?我们现在在/linkdir
下(图中应该有pwd这一步的,但是忘了,感兴趣的可以检验检验),..
就成了/
,然后home/windear/newfile
应该没毛病,怎么会提示找不到呢? - 其实这和
linkdir
是链接文件有关,怎么检验呢?我们想到/linkdir
链接到的是/targetdir/subdir
那么我们现在可不可能其实在/targetdir/subdir
目录下呢?我们来尝试一下: - 我们使用
cat ../../home/windear/newfile
来尝试,因为如果我们是在/targetdir/subdir
目录下,那么到newfile
文件相对路径是要走两个..
的。最后的结果告诉我们,我们的猜想是正确的。