xterm 在移动时不切换目录

Val*_*van 4 shell directory rename

最近,我对 xterm 没有按预期运行感到非常沮丧。这就是我正在做的:

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

    $ mkdir test_01
    $ cd test_01/
    $ echo 'a' > a
    $ cat a
    
    Run Code Online (Sandbox Code Playgroud)

    输出将是:

    a
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打开另一个 xterm(不要关闭第一个)

  4. 运行以下命令:

    $ mv test_01/ test_01_old
    $ mkdir test_01
    $ cd test_01
    $ echo 'b' > a
    $ cat a
    
    Run Code Online (Sandbox Code Playgroud)

    输出将是:

    b
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在在原来的 xterm 中运行命令:

    $ cat a
    
    Run Code Online (Sandbox Code Playgroud)

    输出将是:

    a
    
    Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 12

这与 xterm 关系不大。你可以用两个 shell 做同样的事情,而根本不需要调用 xterm。就此而言,您可以用一个外壳来完成(见下文)。

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

在您的第一个 xterm 中运行的 shelltest_01作为其当前目录。然后(由另一个进程)将该目录重命名为test_01to 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
$ 
Run Code Online (Sandbox Code Playgroud)

如您所见,pwd并且/bin/pwd在我重命名当前目录之前是一致的;然后 shell 的内置pwd打印它记住的当前目录是什么。但是当我这样做时cd $(/bin/pwd),两者又同步了。