Val*_*van 4 shell directory rename
最近,我对 xterm 没有按预期运行感到非常沮丧。这就是我正在做的:
运行以下命令:
$ mkdir test_01
$ cd test_01/
$ echo 'a' > a
$ cat a
Run Code Online (Sandbox Code Playgroud)
输出将是:
a
Run Code Online (Sandbox Code Playgroud)打开另一个 xterm(不要关闭第一个)
运行以下命令:
$ 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)现在在原来的 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_01
to 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)
,两者又同步了。