在过去的 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 组件。这就是cd
和cd -L
所做的,与 不同cd -P
。另请参阅pwd -L
和pwd -P
。
当你这样做时:
cat hello > ../Bsym/file.txt
这个魔法并没有发生。$PWD
没有使用,/proc/self/cwd
而是使用。cwd 是一个 inode,而 .. 只是父 inode,恰好是/tmp
。