通过符号链接的路径歧义
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] >
现在让我们来玩一下 readlink
和 cp
命令:
假设我们输入了指向 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 .
我注意到 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] >
现在让我们来玩一下 readlink
和 cp
命令:
假设我们输入了指向 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 .