为什么要在这里切换文件系统?

为什么要在这里切换文件系统?

如果我导航到一个新的空目录

~$ cd "`mktemp -d`"

并在那里挂载一个文件系统

/tmp/tmp.4MlNzMERSw$ sudo mount /dev/sda5 .

然后尝试列出那里的文件,我没有看到该文件系统上的文件:

/tmp/tmp.4MlNzMERSw$ ll
total 8
drwx------  2 christoph christoph 4096 Jun 18 21:06 ./
drwxrwxrwt 18 root      root      4096 Jun 18 21:09 ../

/tmp/tmp.4MlNzMERSw我对此的解释是,当我在第一个代码块中执行命令时,终端会获取一个文件描述符。我可以通过执行卸载文件系统这一事实证实了这一点

/tmp/tmp.4MlNzMERSw$ sudo umount .

在同一个终端窗口中,但是如果我通过按 打开新终端Ctrl + Shift + N,则不能。在我关闭第二个终端或在其中导航之前,我无法在第一个终端中执行此操作。当然,只要我留在第二个终端中,我就无法卸载它/tmp/tmp.4MlNzMERSw。关键是,我是否将第一个终端移开并不重要,/tmp/tmp.4MlNzMERSw因为它似乎保留了旧的文件描述符(以前的文件描述符/tmp/tmp.4MlNzMERSw)并且不会获取新的文件描述符(这将保留文件)系统繁忙并防止非延迟卸载)。

现在,我不希望文件名自动完成功能在第一个终端窗口中起作用,但在第二个终端窗口中会起作用。这正是我所观察到的。但据我所知,文件名的自动补全无论如何都会以某种方式预取,尽管我目前找不到这方面的证据(但有反对的证据)。

然而,我不明白的是为什么我可以做cd mnt相对位置在第一个终端窗口中向前更改(如)没有首先返回(例如cd ..然后cd tmp.4MlNzMERSw/mntcd tmp.4MlNzMERSw+ cd mnt)。

第一个终端窗口显然可以使用其现有的文件描述符来列出目录的内容,就像安装之前一样。那么为什么它不使用相同的文件描述符来向前导航?* 这不可能吗?

 * 如果这样做的话,操作显然会失败。

我的设置

我的计算机运行 Ubuntu 16.04,并安装了 Linux 4.4.0 和最新更新。我使用默认终端模拟器(GNOME 终端(版本 3.18.3))和 bash 4.3.48:

$ /proc/self/exe --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ gnome-terminal --version
GNOME Terminal 3.18.3

$ uname -r
4.4.0-79-generic

答案1

/tmp/tmp.4MlNzMERSw$ sudo mount /dev/sda5 .

完成此操作后,/dev/sda5将安装在/tmp/tmp.4MlNzMERSw.但 shell 的当前目录仍然是 old /tmp/tmp.4MlNzMERSw,即隐藏在挂载点后面的目录。

它似乎保留其旧的文件描述符(/tmp/tmp.4MlNzMERSw 曾经是)并且不获取新的文件描述符

进程的当前目录不是编号的文件描述符,但它的行为非常类似于文件描述符。当前目录是目录的句柄,而不是字符串。最初用于到达目录的路径可能不再有效,但这不会影响文件描述符的有效性。文件描述符一直引用同一个文件,直到它被关闭。该 shell 进程的当前目录一直是 的子目录,/tmp直到 shell 发出chdir系统调用。

如果重命名目录,您会看到类似的内容:

$ mkdir /tmp/foo
$ cd /tmp/foo
$ pwd
/tmp/foo
$ touch first
$ ls
first
$ mv /tmp/foo /tmp/bar
$ pwd
/tmp/foo
$ pwd -P
/tmp/bar
$ mkdir /tmp/foo
$ echo $PWD
/tmp/foo
$ ls
first
$ ls $PWD
$ cd $PWD
$ ls

shell 的当前目录仍然是旧目录/tmp/foo,即包含名为 的文件的目录first,直到cd调用该命令。

相关内容