使用 cd 时使用 /

Luk*_*rau 12 linux mac terminal command-line

我在我的 mac 上的主目录中:

$ pwd
/Users/lukas
Run Code Online (Sandbox Code Playgroud)

当我cd在附近时,我不会(也不能)以以下方式开始路径/

$ cd Documents/
/Users/lukas/Documents

$ cd /Documents
-bash: cd: /Documents: No such file or directory
Run Code Online (Sandbox Code Playgroud)

除非我在/

$ pwd
/
$ cd Users
/Users

$ cd /Users
/Users
Run Code Online (Sandbox Code Playgroud)

为什么我可以/在从/to时在路径前面使用/Users但在任何后续级别中都不能使用?这是特定于 macOS 还是标准的 Unix 行为?

dav*_*dgo 45

这是标准的 Unix 行为。

/在路径的开始表示磁盘(或文件系统树的开始/最上层)的根。由于Documents未脱根,/Documents无法找到。

/Users 不在根目录下,所以不会出现这个问题。

您可以使用cd /Users/lukas/Documents更改为该路径。

或者,您可以使用相对寻址。基于 Unix 的文件系统有 2 个特殊目录:

  • . 意思是“这个目录”,
  • .. 这意味着父目录。

如果你在/Users/lukascd ./Documents会带你到正确的地方。

假设您在/Users/Lukas/Documents并且想要去/Users/Janes/Documents,您可以发出一个命令cd ../../Janes/Documents- 使用..会带你回到一个级别 - 所以在进入新的相对路径之前你会做两次。

  • 同样取决于您使用的外壳, cd $HOME/Documents 或 cd ~/Documents 也可以使用。shell 变量 HOME(通过 $HOME 访问)是您的主目录的常用存储位置(~ 是 $HOME 的特殊别名)。 (2认同)

Lig*_*bit 13

/Users/lukas是“绝对”路径。前导/代表文件系统的根目录。

lukas是“相对”路径。由于它没有锚定到根,这意味着“在当前目录中查找它”。除非当前目录是/Users(或其他带有 a 的目录lukas),否则这将失败。

所以,让我们探索你的例子,假设你在/Users/lukas

$ cd Documents/
/Users/lukas/Documents
Run Code Online (Sandbox Code Playgroud)

给定的相对路径 => 更改为/Users/lukas.

$ cd /Documents
-bash: cd: /Documents: No such file or directory
Run Code Online (Sandbox Code Playgroud)

给定的绝对路径 => 更改为目录/Documents

$ pwd
/
Run Code Online (Sandbox Code Playgroud)

这表明您现在已将工作目录更改为根目录/(尽管cd未显示执行此操作的命令)。

$ cd Users
/Users
Run Code Online (Sandbox Code Playgroud)

给定的相对路径 => 更改为/.

$ cd /Users
/Users
Run Code Online (Sandbox Code Playgroud)

给定的绝对路径 => 更改为目录/Users

每次的关键是领先/。有了它,路径是绝对的。没有它,路径是相对的。此规则是明确的,因为所有绝对路径都以 开头/(因为根目录始终称为/)。

下面是一些伪代码,粗略地描述了该算法:

MakePathAbsolute(path):
   if <path> starts with '/'
      return <path>
   else
      return <current directory>/<path>
Run Code Online (Sandbox Code Playgroud)

你传递给的参数cd通过这个算法;您最终更改到的目录是算法返回的路径。


进一步阅读: