xterm 在移动目录时不切换目录

xterm 在移动目录时不切换目录

最近,我对 xterm 的行为不符合预期感到非常沮丧。这就是我正在做的:

  1. 打开xterm
  2. 运行以下命令:

    $ mkdir test_01
    $ cd test_01/
    $ echo 'a' > a
    $ cat a
    

    输出将是:

    a
    
  3. 打开另一个 xterm (不要关闭第一个)

  4. 运行以下命令:

    $ mv test_01/ test_01_old
    $ mkdir test_01
    $ cd test_01
    $ echo 'b' > a
    $ cat a
    

    输出将是:

    b
    
  5. 现在在原始 xterm 中运行命令:

    $ cat a
    

    输出将是:

    a
    

为什么会出现这种情况?在此阶段,两个 xterm 使用命令报告相同的目录pwd(即/home/user_1/test_01)。

答案1

这个和xterm关系不大。您可以使用两个 shell 执行相同的操作,而无需调用 xterm。就此而言,您可以使用一个 shell 来完成此操作(见下文)。

每个进程都有一个当前工作目录。这不是按名称跟踪的,而是作为(或多或少)指向目录本身的指针。 (我不确定它在内部是如何表示的;它可能类似于目录的主设备号和次设备号以及索引节点号。)

在第一个 xterm 中运行的 shell 的test_01当前目录是。然后该目录(由另一个进程)从 重命名为test_01--test_01_old但它仍然是同一目录,并且 shell 进程仍将其作为当前目录。

内核不记得当前目录的名称,但你的 shell 会。当您运行内置pwd命令时,它会使用此信息。第一个 xterm 下的 shell 没有注意到目录已重命名,因此当您键入时,pwd它会打印缓存的路径。

/bin/pwd它是一个外部命令,它无权访问 shell 的缓存信息。它的工作原理是从当前目录(它不能立即知道其名称)开始,查看其..条目,然后向上遍历目录层次结构,直到到达根目录(即条目..指向其自身的目录);然后它以相反的顺序打印由字符分隔的路径元素/

例如,我刚刚在我的系统(Ubuntu 12.04,bash 4.2.24)上执行了以下操作:

$ pwd ; /bin/pwd
/home/kst
/home/kst
$ mkdir test_01
$ cd test_01
$ pwd ; /bin/pwd
/home/kst/test_01
/home/kst/test_01
$ mv /home/kst/test_01 /home/kst/test_01_old
$ pwd ; /bin/pwd
/home/kst/test_01
/home/kst/test_01_old
$ cd $(/bin/pwd)
$ pwd ; /bin/pwd
/home/kst/test_01_old
/home/kst/test_01_old
$ 

正如你所看到的,pwd并且/bin/pwd是一致的直到我重命名当前目录;然后 shell 的内置功能pwd会打印它所记住的当前目录。但当我这样做时cd $(/bin/pwd),两者又恢复同步了。

相关内容