最近,我对 xterm 的行为不符合预期感到非常沮丧。这就是我正在做的:
- 打开xterm
运行以下命令:
$ mkdir test_01 $ cd test_01/ $ echo 'a' > a $ cat a
输出将是:
a
打开另一个 xterm (不要关闭第一个)
运行以下命令:
$ mv test_01/ test_01_old $ mkdir test_01 $ cd test_01 $ echo 'b' > a $ cat a
输出将是:
b
现在在原始 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)
,两者又恢复同步了。