终端选项卡中带有符号链接的pwd的奇怪行为



如果我通过创建符号链接

ln -s /path/to/linked/dir current/path/link_name

并通过将目录更改为current/path/link_name

cd link_name

然后我可以使用pwd命令检查我在哪里。输出将是

current/path/link_name

但是,如果我使用一些终端模拟器,如terminator、konsole或其他,我可以在同一目录中拆分选项卡或创建一个新选项卡。新创建的选项卡中pwd命令的输出将是

/path/to/linked/dir

在许多情况下,这并不方便。有人知道如何在某些终端模拟器中改变这种行为吗?

p。S.我还注意到,从/current/path/link_name键入的ls的输出与从/path/to/linked/dir键入的ls的输出相同。

你不能。原因是在系统调用执行后,您丢失了如何到达那里的信息。一些终端仿真器(主要是bash(1)shell)试图记住这一点,并将pwd作为内部命令来实现,以应对这种情况。但一般来说,如果你尝试

/bin/pwd

随着时间的推移,你会发现所有关于你是如何到达最终目录的信息都丢失了。

问问自己/bin/pwd是如何工作的,它是如何确定你所在的目录的,你就会回答自己这个问题:

系统在每个进程的系统数据中维护一个当前目录(pwd命令从其父shell继承此目录),但为了节省资源,它只存储实际上是当前目录的目录的索引节点号(实际上,它维护的不是对核心内索引节点结构的引用)。它不存储你用来定位它的路径,它存储这些信息只是为了在你打开文件时要求相对路径时能够获得起点。这个问题与确定多重链接文件属于哪个目录相同…没有为文件存储父目录,因为它可能在多个目录中同时链接到它。。。对于目录也是如此,但它们内部有一个..条目,链接到它们的父目录(它们的真正的父目录,因为现在通过正常链接允许一个目录属于不同的目录,这是系统禁止的,并由mkdir(2)系统调用确保)pwd(1)命令正是使用这些链接来查找父目录(然后通过搜索父目录中当前目录的索引节点号,在父目录中找到当前目录),直到该算法导致相同的索引节点(根目录具有这种特殊特性,其..条目再次指向自己),因此它停止向上移动。pwd只能工作,因为它遵循的是目录,而不是文件。

Terminator 1.90可以随心所欲。在一个示例会话中:

$ cd -- "$(mktemp --directory)"
$ mkdir a
$ ln -s a b
$ cd b

Ctrl-Shift-e(或ot

最新更新