我是一个学习系统程序的初学者。
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_resolution
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13
答案2
在以文件路径作为参数的系统调用中,.
是指的相对路径这里,并且..
到父目录。与¹some/dir/.
相同,是 的父目录,如果不是符号链接,则可能是。some/dir
some/dir/..
some/dir
some
some/dir
传统上,.
和..
被实现为硬链接,.
到它所在的目录,..
到它的父目录,最初由mkdir
实用程序,后来由mkdir()
系统调用。根据文件系统的不同,情况可能仍然如此,也可能不再如此。这些.
和可能会或可能不会由/..
返回,但无论如何,它们始终需要解决readdir()
getdents()
这里和父目录在以文件路径作为参数的系统调用中。
因此,这也适用于大多数采用文件路径作为参数的命令:
vi some/dir/../file
编辑file
的父目录中的文件some/dir
(不一定与 相同some/file
)。ls
ls .
是列出当前工作目录内容的缩写。列出当前工作目录文件的详细信息的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/dir
some
/somewhere/entirely/different
记住这一点很重要,因为它可能会引起一些混乱。例如vi some/dir/../file
可以编辑不同的文件。cd some/dir/.. && vi file
为了与其他命令一样cd
处理,您需要选项²。这就是为什么经常建议在脚本中使用它(因此在这方面,用 shell 编写的程序与用任何其他语言编写的程序的工作方式相同)。..
-P
cd -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