假设您有目录/dir1
和/dir2/linked
,其中后者是前者的符号链接。
当您cd
执行linked
和时pwd
,您将得到输出/dir2/linked
。如果你那么做cd ..
,你就会被穿上/dir2
。这种行为和你之前所处的观念是一致的/dir2/linked
。然而,据我了解,..
任何目录的父目录()都存储在目录inode中(即:物理上在磁盘中)。显然,既然/dir2/linked
是 true /dir1
,那么 inode 上的父目录一定是/
更复杂的是,在 内部,和/dir2/linked
的输出是不同的!似乎尊重符号链接路径,同时尊重“物理”路径。正如中提到的ls ..
cd .. ; ls .
cd
ls
这个问题,cd -P
不过这个用例是有的。
man pwd
提到“物理”和“逻辑”工作目录,但此时我仍然有几个问题:
PWD
如中所述,此行为是否始终由环境变量提供man pwd
?- 如果default
cd
和ls
都是 shell 命令(即:不是程序),为什么它们有不同的行为? - 是否典型程序(不是shell命令)使用
PWD
而不是物理路径?我知道这取决于实施,但是有什么经验法则吗?
答案1
bash
当您使用符号链接进入目录时,“了解”符号链接并跟踪此信息。
您可以通过在示例中执行以下操作来检查这一点:
$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1
您需要使用空变量启动 bash PWD
,否则它会使用该技巧来显示“假”路径。
注意ls
是一个单独的程序,因此 bash 不知道你如何到达当前目录,所以ls ..
只会显示真实的父目录,与您所遵循的符号链接无关。
大多数程序不会依赖于环境变量CWD
,因为启动程序的方式有很多种,通过 bash shell 只是其中一种,因此期望CWD
包含正确的值是不可靠的(CWD
在执行之前尝试设置错误的值bash -c pwd
,您可以看到它检查理智值)。