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

loo*_*bee 10 shell directory cd-command symlink

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

当您cd使用linked和 时pwd,您会得到输出/dir2/linked。如果你那样cd ..,你会被穿上/dir2。这种行为与你/dir2/linked之前的概念是一致的。但是,据我所知,..任何目录的父目录 ( ) 都存储在目录 inode 中(即:物理上在磁盘中)。显然,既然/dir2/linked是真的/dir1,那么inode上的父目录必须是/

为了进一步使问题复杂化,而里面/dir2/linked的输出ls ..cd .. ; ls .是不同的!似乎cd尊重符号链接的路径,同时ls尊重“物理”路径。正如在这个问题中提到的cd -P,这个用例是有的。

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

  • 这种行为是否总是由PWD环境变量提供,如man pwd?
  • 为什么默认cdls有不同的行为,如果它们都是 shell 命令(即:不是程序)?
  • 典型程序(不是 shell 命令)是否使用PWD物理路径而不是物理路径?我意识到这取决于实施,但有什么经验法则吗?

wur*_*tel 6

bash 当您使用符号链接进入目录时,“了解”符号链接并跟踪此信息。

您可以通过在示例中执行以下操作来检查这一点:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1
Run Code Online (Sandbox Code Playgroud)

您需要使用空PWD变量启动 bash ,否则它会使用该技巧来显示“假”路径。

请注意,这ls 一个单独的程序,因此 bash 不知道您如何到达当前目录,因此ls ..只会显示实际父目录的内容,而不是与您遵循的符号链接相关的内容。

大多数程序将不依赖于环境变量,CWD因为有很多方法可以启动程序,通过 bash shell 只是其中一种,因此期望CWD包含正确的值是不可靠的(尝试CWD在执行之前设置错误bash -c pwd,您可以看到它检查理智的价值)。