根目录上的cd ..


44

为什么cd ..在根文件夹中键入不警告或失败并显示错误?

我期望:

/$ cd ..
-bash: cd: ..: No such file or directory

相反,我留在了/。当然,这是因为..确实存在的/,而且是根本/,就像.。我只是想知道为什么会这样。


6
没有答案,但这里是一个很好的相关阅读,罗勃·派克在G +讨论dotfile(一个或多个)的起源。
bsd 2014年

Answers:


53

根据开放组(负责POSIX标准):

每个目录只有一个父目录,在第一个目录中用点号表示。[...]文件名相对于根目录的引用是实现定义的。在版本7中,它指的是根目录本身。这是POSIX.1-2008中提到的行为。在某些联网系统中,构造/../hostname/用于引用另一个主机的根目录,而POSIX.1允许这种行为。

(资源)


29

您不会出错,因为即使/目录实际上也具有的有效目录条目..,但是与其他目录不同,它指向目录本身,因此其行为与以下内容相同.

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

作为第一列告诉你,...,和/都具有相同的inode数,因此是同一个文件系统的条目。

因此,即使您cd ..内心深处/也只是停留在/


13
该问题询问为什么存在..目录条目。
Nick Matteo 2014年

3
我想到的唯一原因是,您要/像对待其他文件夹一样对待,包括的有效条目..。否则/,与系统中的所有其他文件夹相比,您将不得不区别对待。
Dohn Joe 2014年

15

在那里是因为要删除它,需要在内核和C库中创建特殊情况的处理代码。现在,您可以假设总会有一个“。”。和“ ..”在您转到的任何目录中。

现在唯一需要的特殊情况代码是在文件系统安装代码中,该代码将覆盖inode值“ ..”以指向包含安装点的目录,因为根目录并不总是根目录。


毕竟,树结构中的“父代引用”不可能没有任何特殊情况的处理,不是吗?从定义上说,根必须是特殊的,任何掩盖的尝试都会导致特殊情况或其他地方的混乱。
musiphil 2014年

@musiphil在Unix中,这里的特殊情况被改编为mount命令及其相关的特殊文件/etc/fstab
luser droog

1

另一种方法来检查什么.,并../真正是:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

如您所见,...指向/


1

/中存在'..'的另一个原因是,如果不在目录中,则会造成另一种特殊情况:根目录的硬链接少于所有其他目录(所有目录节点都有n + 2个链接,其中n为内部直接子目录的数量)。这将破坏依赖于进行目录扫描优化的各种程序。


0

很好,因为那里,否则我将无法通过垃圾邮件../../../../从文件夹进入根目录。如果它不允许..在根目录,那么我将被困在工作目录下的文件夹数量。


10
这有什么错cd /
2014年

@Bach有时,键盘混搭更有趣。此外,在许多情况下,您并不想扎根,在这种情况下,使用../效果更好。我还用PHP进行了很多文件操作,但/由于多种原因我不能这样做。
Skylar Ittner 2014年

2
不利的一面是,您可能不小心输入了太多../s并操作了(或删除了)您原本不打算出错的文件。
jamesdlin 2014年

4
../即使文件系统显然允许重复,但重复的次数超过了所需的次数,并希望它按预期工作,这对我来说似乎是(休眠)逻辑错误。
musiphil 2014年

@musiphil在命令之间输入空格-是一个逻辑错误(假设尾-f | grep之间的所有空格都是必须的)。大多数Unix人士都受此困扰。键入“ ../ ..”似乎是Windows常见的问题(默认情况下,cmd从X:\ Windows开始,并且您必须从头开始发送垃圾邮件。)。当有一个大问题时,为什么要解决一个小问题呢?(空格)
kagali-san 2014年
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.