了解目录符号链接遍历和父目录

了解目录符号链接遍历和父目录

假设您有目录/dir1/dir2/linked,其中后者是前者的符号链接。

当您cd执行linked和时pwd,您将得到输出/dir2/linked。如果你那么做cd ..,你就会被穿上/dir2。这种行为和你之前所处的观念是一致的/dir2/linked。然而,据我了解,..任何目录的父目录()都存储在目录inode中(即:物理上在磁盘中)。显然,既然/dir2/linked是 true /dir1,那么 inode 上的父目录一定是/

更复杂的是,在 内部,和/dir2/linked的输出是不同的!似乎尊重符号链接路径,同时尊重“物理”路径。正如中提到的ls ..cd .. ; ls .cdls这个问题cd -P不过这个用例是有的。

man pwd提到“物理”和“逻辑”工作目录,但此时我仍然有几个问题:

  • PWD如中所述,此行为是否始终由环境变量提供man pwd
  • 如果defaultcdls都是 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,您可以看到它检查理智值)。

相关内容