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


9

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

当您cd到达linkedand时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
  • 如果它们都是shell命令(即不是程序),为什么要默认cdls具有不同的行为?
  • 是否使用典型程序(而非shell命令)PWD代替物理路径?我知道这取决于实现,但是有经验法则吗?

1
在大量的信息这个答案
斯特凡Chazelas

1
@StéphaneChazelas这是一个了不起的答案,感谢您的分享
goncalopp 2015年

别客气。如果您打算自己回答自己的问题,请随时从此处复制粘贴文本。
斯特凡Chazelas

Answers:


5

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

您可以通过在示例中执行以下操作来检查此问题:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

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

请注意,这ls 一个单独的程序,因此没有bash知道如何到达当前目录,因此ls ..将仅显示真实父目录的内容,而不是相对于您跟随的符号链接的内容。

大多数程序将不依赖于环境变量,CWD因为启动程序的方式有很多,通过bash shell只是一种,因此期望CWD包含正确的值并不可靠(尝试将其设置CWD为错误的值,然后bash -c pwd再检查)的价值)。


知道这样清除很有用PWD,但是就其本身而言,它不能回答我提到的问题
goncalopp 2015年

添加了更多信息。
wurtel

我对lsbash提供的印象很深,但是您并help以其他方式说服了我。事情变得更加清楚了,谢谢!
goncalopp 2015年

PWD是POSIX中的标准。您可以依靠它进行设置。如果未设置,则可能会中断,例如pwd 实用程序:另请参阅环境变量
darkfeline
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.