loo*_*bee 10 shell directory cd-command symlink
假设您有目录/dir1
and /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
?cd
并ls
有不同的行为,如果它们都是 shell 命令(即:不是程序)?PWD
物理路径而不是物理路径?我意识到这取决于实施,但有什么经验法则吗?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
,您可以看到它检查理智的价值)。