为什么我必须从已删除的目录中 cd 出来?

Mar*_*son 19 command-line shell directory cd-command

在我的服务器上,我有一个看起来像这样的目录结构:

/myproject/code
Run Code Online (Sandbox Code Playgroud)

我通常有一个到服务器的 ssh 连接并“站在”该目录中:

root@machine:/myproject/code#
Run Code Online (Sandbox Code Playgroud)

当我部署新版本的代码时,代码目录被删除,所以我只剩下:

root@machine:/myproject/code# ./run
-bash: ./run: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我找到的唯一解决方案是退出并返回:

root@machine:/myproject/code# cd ../code
root@machine:/myproject/code# ./run
Running...
Run Code Online (Sandbox Code Playgroud)

我可以避免这种情况吗?这是一种有点奇怪的行为。如果您有一个很好的解释为什么会发生这种情况,我将不胜感激。

gol*_*cks 27

对我来说,"cd ../code" 是一个 noop。我很想知道为什么不是。

因为文件和目录基本上是文件系统 inode,而不是名称——这可能是特定于文件系统类型的实现细节,但对于所有 ext 系统都是如此,所以我将在这里坚持下去。

当一个目录code被创建时,它与一个新的 inode 相关联,这就是它所在的位置。没有保存以前删除的文件和目录的记录,因此系统无法检查它曾经占用的 inode 并可能将事物重新排列以使其再次相同;这样的系统很快就会变得无法运行,而且无论如何,可能无法保证您会再次回到那里——这有点不受欢迎,因为这意味着如果创建目录,您也可能会意外地结束在其他地方这需要您的(当前未使用的)inode。

我不确定这最后一种可能性是否存在,或者是否跟踪了当前分配给当前工作目录的已删除目录的 inode,以便在此期间不会分配任何内容等。

  • 这是这里的真正答案。 (3认同)

Ant*_*hon 14

在执行下一个命令之前,您的 shell不会每次都cd对它在上一个命令期间所在的路径进行操作。

您删除了当前目录并创建了一个同名目录,该目录不是同一个目录,只是具有相同名称/路径的目录。

如果目录在本地文件系统上被删除,像 Nautilus 和 Windows 资源管理器这样的文件浏览器通常会“上升”目录树。然而,对于网络文件系统而言,情况并非总是如此,在这种情况下,有时不会注意到删除,而重新出现可能会让您最终进入新目录。

cd在执行下一个命令之前,shell 可以进入当前目录,我不知道任何这样做(或可以配置为这样做)。