`cd ..`、`cd .` 和 `cd ...` 之间有什么区别?他们分别能做什么?

`cd ..`、`cd .` 和 `cd ...` 之间有什么区别?他们分别能做什么?

我是一个学习系统程序的初学者。

cd ..我用谷歌搜索了、cd .、 和的用法cd ...,但事实证明我只知道这cd ..意味着后移一个目录。

我在 MacOS 的终端上尝试过它们。打字cd ..有效。然而,当我输入时cd ...,它说

zsh: command not found: cd...

输入 时cd .,路径不会改变。

请帮我解答这个问题,谢谢。

答案1

目录...是特殊目录,分别引用当前目录及其父目录。

该命令cd更改目录。所以cd .没有什么特别的(你去你所在的地方),等等。

所有 UNIX shell 都要求命令及其参数以空格分隔,因此cd...不是cd命令,也不存在。在某些系统上,...是向上两个目录的快捷方式,但这不是标准的,并且不适用于我所知道的任何当前系统。所以cd...可能会给予command not found并且cd ...可能会给予no such file or directory

cd命令是 shell 内置命令,可以在 shell 的手册页中找到它的文档。例如,man bash或者man bash-builtins

有关路径解析如何工作的详细信息(包括使用.和 )..,可以在 POSIX 标准中/找到:man path_resolutionhttps://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13

答案2

在以文件路径作为参数的系统调用中,.是指的相对路径这里,并且..父目录。与¹some/dir/.相同,是 的父目录,如果不是符号链接,则可能是。some/dirsome/dir/..some/dirsomesome/dir

传统上,...被实现为硬链接,.到它所在的目录,..到它的父目录,最初由mkdir实用程序,后来由mkdir()系统调用。根据文件系统的不同,情况可能仍然如此,也可能不再如此。这些.和可能会或可能不会由/..返回,但无论如何,它们始终需要解决readdir()getdents()这里父目录在以文件路径作为参数的系统调用中。

因此,这也适用于大多数采用文件路径作为参数的命令:

  • vi some/dir/../file编辑file的父目录中的文件some/dir(不一定与 相同some/file)。
  • lsls .是列出当前工作目录内容的缩写。列出当前工作目录文件的详细信息的ls -ld缩写。ls -ld .
  • ls -l ..列出当前工作目录的父目录的内容。

cd(并且pushd在那些拥有它的 shell 中)虽然在大多数 shell 中是一个例外,因为它cd实现了自己的逻辑目录遍历

cd some/dir/..不执行 a chdir("some/dir/..")(其中chdir()是更改当前工作目录的实际系统调用),但chdir("some")在某些 shell 中chdir("$PWD/some")(有时,即使$PWD不再是当前工作目录的路径)。并且cd ..不是在做chdir("..")类似的事情chdir(dirname($PWD))

也就是说,cd(且cd仅)..对其本身进行特殊处理,以便将符号链接视为目录,以便尝试最大程度地减少用户意外的风险。例如,即使或恰好是 的符号链接,cd some/dir; cd ../..也应该让您回到最初的位置。some/dirsome/somewhere/entirely/different

记住这一点很重要,因为它可能会引起一些混乱。例如vi some/dir/../file可以编辑不同的文件。cd some/dir/.. && vi file

为了与其他命令一样cd处理,您需要选项²。这就是为什么经常建议在脚本中使用它(因此在这方面,用 shell 编写的程序与用任何其他语言编写的程序的工作方式相同)。..-Pcd -P

现在,...它并不特殊,因此它被视为任何其他文件。

mkdir ... && cd ...将创建一个名为...(由于以 a 开头而隐藏.)的目录并chdir()进入其中(作为chdir("...")chdir("$PWD/...")取决于 shell)。

cd ......如果不喜欢,将返回不存在的错误cd any/other/inexistent/directory

cd...cd和之间没有空格...会尝试调用该cd...命令,该命令可能在您的环境中不存在并相应地返回错误。

现在,为了缩短输入时间,有些人为cd...as 创建了一个别名:

alias cd...='cd ../..'  cd....='cd ../../..'

因此调用cd...cd调用当前工作目录的父目录的父目录(逻辑上,因为它会从 的尾部取出两个目录组件,而不是像上面那样$PWD执行 a )。chdir("../..")

zsh也有全球的别名可以在任何地方扩展,而不仅仅是像常规别名那样在命令位置,因此有些人会这样做:

alias -g ...=../.. ....=../../..

这意味着cd ...andls ... 被更改为执行前cd ../..​​或ls ../..执行前。但这并不适用cd .../dir。有.使用自定义按键绑定来实现类似功能的更好方法


1 虽然 ifsome/dir是符号链接,some/dir/.但 , likesome/dir/会引用符号链接指向的目录,这一区别对于在符号链接解析之前应用的系统调用很重要,例如lstat(), lchown(), readlink()unlink()而不是之后应用(例如open(), chown()...)。

² 嗯,-P不会阻止$CDPATH/处理,也不会阻止(或, ... 在 zsh 中)$cdpath的特殊处理,但这是一个单独的问题。--1+2

相关内容