通过符号链接的路径歧义

Path ambiguity through symbolic links

我注意到 UNIX 系统中的一个奇怪行为:

I'm standing in /noob/
I have a symbolic link to a folder (A@ -> /B/C/D/A)
I enter the folder via my symlink (cd A) 
pwd says /noob/A/
In /B/C/D/A/ i have a file abc which I can see now.
I want to copy it to /noob/
I type cp abc ..
I type cd ..
I end up in /noob/ which is empty - but the file ended up in /B/C/D/ ???

当给出 .. 作为参数时,cp 和 cd 指向何处会出现这种歧义?我觉得很混乱。谁能用我能理解的术语解释一下? (=简单)

一切顺利,请原谅一个 UNIX 菜鸟的愚蠢问题。拉斯

首先让我们通过查看 help 菜单来了解 cd 命令的行为方式。我们正在寻找的是选项 -L (默认行为)和选项 -P

$ help cd cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.

...
...

Options:
    -L      force symbolic links to be followed: resolve symbolic links in
    DIR after processing instances of `..'
    -P      use the physical directory structure without following symbolic
    links: resolve symbolic links in DIR before processing instances
    of `..'
...
...

重要部分

The default is to follow symbolic links, as if `-L' were specified.
`..' is processed by removing the immediately previous pathname component
back to a slash or the beginning of DIR.

Exit Status:
...

如您所见,cd 的默认行为与您想象的不同,因为他将以自己的方式操作 pwd 命令访问的 $PWD 变量,在每一步你都可以 运行 pwd 命令或执行 echo $PWD 以查看它如何与下面不同的 cd 命令反应。

让我们来玩玩cd命令:

我们从以下文件夹开始,符号为link:

[/home/arobert/test/noob] >
ls -ltra
total 8
drwxrwxr-x 5 arobert arobert 4096  5月 11 09:48 ..
lrwxrwxrwx 1 arobert arobert   26  5月 11 09:48 A -> /home/arobert/link/B/C/D/A
drwxrwxr-x 2 arobert arobert 4096  5月 11 10:03 .

用法示例:

[/home/arobert/test/noob] >
cd A
[/home/arobert/test/noob/A] >
cd ..
[/home/arobert/test/noob] >
cd -L A
[/home/arobert/test/noob/A] >
cd ..
[/home/arobert/test/noob] >
cd -P A
[/home/arobert/link/B/C/D/A] >
cd -P ..
[/home/arobert/link/B/C/D] >
cd /home/arobert/test/noob/
[/home/arobert/test/noob] >
cd A
[/home/arobert/test/noob/A] >
cd -P ..
[/home/arobert/link/B/C/D] >

现在让我们来玩一下 readlinkcp 命令:

假设我们输入了指向 A -> /home/arobert/link/B/C/D/A 的符号 link,其中我们有一个文件 a

[/home/arobert/test/noob/A] >
ls -ltra
total 8
drwxrwxr-x 3 arobert arobert 4096  5月 11 09:55 ..
-rw-rw-r-- 1 arobert arobert    0  5月 11 10:10 a
drwxrwxr-x 2 arobert arobert 4096  5月 11 10:10 .

从这个文件夹让我们看看指向 ... 的位置,方法是使用 readlink -f 命令:

[/home/arobert/test/noob/A] >
readlink -f .
/home/arobert/link/B/C/D/A

[/home/arobert/test/noob/A] >
readlink -f ..
/home/arobert/link/B/C/D

因此,当您从 /home/arobert/test/noob/A 位置 运行 相当于 /home/arobert/link/B/C/D/A 命令 cp a .. 时,文件将移动到 /home/arobert/link/B/C/D 作为 .. 指向它。

你现在可以做什么:

  • 在您的 cp 命令中使用绝对路径以避免意外。
  • 使用
  • /home/arobert/test/noob/ 目录调用命令

例如:

[/home/arobert/test/noob] >
cp A/a .

因为 readlink -f . 指向正确的文件夹

[/home/arobert/test/noob] >
readlink -f .
/home/arobert/test/noob

结果:

[/home/arobert/test/noob] >
ls -ltra
total 8
drwxrwxr-x 5 arobert arobert 4096  5月 11 09:48 ..
lrwxrwxrwx 1 arobert arobert   26  5月 11 09:48 A -> /home/arobert/link/B/C/D/A
-rw-rw-r-- 1 arobert arobert    0  5月 11 10:13 a
drwxrwxr-x 2 arobert arobert 4096  5月 11 10:13 .