我的 Linux 符号链接运行正常吗?

我的 Linux 符号链接运行正常吗?

在过去的 15 年里,我一直断断续续地使用 Linux,今天我在 bash 中发现了一些令我惊讶的东西。

设置以下目录结构:

$ cd /tmp
$ mkdir /tmp/symlinktest
$ mkdir /tmp/symlinktest/dir
$ mkdir /tmp/symlinktarget

现在在 symlinktest 中创建两个指向 symlinktarget 的符号链接:

$ cd /tmp/symlinktest
$ ln -s ../symlinktarget Asym
$ ln -s ../symlinktarget Bsym

现在,在 bash 中,以下 tab 补全会出现奇怪的情况。输入以下内容:

$ cd dir
$ cd ../A[TAB]

按上面的 Tab 键可完成该行:

$ cd ../Asym/

正如我所料。现在按 Enter 键更改为 Asym 并输入:

$ cd ../B[TAB]

这次按下 Tab 键完成链接到:

$ cd ../Bsym[space]

请注意,Bsym 后面现在有一个空格,并且没有尾随斜杠。

我的问题是,为什么当从物理目录“dir”更改为 Asym 时,它会识别出 Asym 是指向目录的链接,但是当从一个 sym 链接更改为另一个 sym 链接时,它却无法识别出它是指向目录的链接?

此外,如果我尝试在 Asym 中创建一个新文件,我会收到一条错误消息:

$ cd /tmp/symlinktest/Asym
$ cat hello > ../Bsym/file.txt
-bash: ../Bsym/file.txt: No such file or directory

我一直认为符号链接几乎是透明的,除了需要操作它们的程序。这是正常现象吗?

非常感谢,

安迪

答案1

bash 的cd内置命令有一些神奇的作用..

当你这样做时:

cd ../Bsym

它查看$PWD,删除最后一个组件,添加 Bsym 组件。这就是cdcd -L所做的,与 不同cd -P。另请参阅pwd -Lpwd -P

当你这样做时:

cat hello > ../Bsym/file.txt

这个魔法并没有发生。$PWD没有使用,/proc/self/cwd而是使用。cwd 是一个 inode,而 .. 只是父 inode,恰好是/tmp

相关内容