2

如果我通过创建符号链接

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

并将目录更改为current/path/link_namevia

cd link_name

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

current/path/link_name

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

/path/to/linked/dir

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

PS我还注意到 typed from 的输出与typed lsfrom/current/path/link_name的输出相同。ls/path/to/linked/dir

4

2 回答 2

1

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

/bin/pwd

您会发现所有有关您如何到达最终目录的信息都随着时间的推移而丢失。

问问自己这项/bin/pwd工作如何以及它如何确定您所在的目录,您将回答自己的问题:

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

于 2017-02-10T09:56:27.440 回答
0

终结者 1.90 做你想做的事。在示例会话中:

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

Ctrl- Shift- e(或o, 或t)。这个时候我还在b

于 2017-02-09T12:01:57.240 回答