如果我通过创建符号链接(symbolic link)
ln -s /path/to/linked/dir current/path/link_name
并将目录更改为 current/path/link_name
via
cd link_name
然后我可以检查我在哪里使用 pwd 命令。输出将是
current/path/link_name
但如果我使用一些终端仿真器,例如terminator、konsole 或其他,我可以拆分选项卡或在同一目录中创建一个新选项卡。新创建的选项卡中 pwd 命令的输出将是
/path/to/linked/dir
在很多情况下,这并不方便。有人知道如何在某些终端仿真器中更改此行为吗?
P.S. 我还注意到从 /current/path/link_name
键入的 ls
的输出与 的输出相同>ls
从 /path/to/linked/dir
输入。
最佳答案
你不能。原因是您在系统调用执行后丢失了有关您如何到达那里的信息。一些终端仿真器,主要是 bash(1)
shell 试图记住这一点,并将 pwd
作为内部命令来实现,以应对这种情况。但一般来说,如果你尝试
/bin/pwd
您会发现有关如何到达最终目录的所有信息都随着时间的推移丢失了。
问问自己 /bin/pwd
是如何工作的以及它如何确定你所在的目录,你会回答自己这个问题:
系统在系统数据中为每个进程维护了一个当前目录(pwd
命令从其父shell继承了这个),但是为了节省资源,它只存储实际上是您当前目录的目录的 inode 编号(实际上不是,它维护对核心 inode 结构的引用)。它不存储您用来定位它的路径,它存储该信息只是为了在您打开文件时询问相对路径时能够获得起点。问题与确定多个链接文件属于哪个目录相同......没有为文件存储父目录,因为它可以在多个链接到它的目录中同时。 .. 对于目录也是如此,但是它们内部有一个 ..
条目链接到它们的父级(它们的真正的父级,因为现在允许一个目录属于通过正常链接到不同的目录,这被系统禁止,并由 mkdir(2)
系统调用确保) pwd(1)
命令正是使用这些链接找到父目录(然后在父目录中找到当前目录,通过在其上搜索当前目录的inode号),直到该算法得出相同的inode(根目录具有此特殊特性,其..
入口再次指向自身)所以它停止上升。 pwd
只能工作,因为它跟随目录,而不是文件。
关于linux - 终端选项卡中带有符号链接(symbolic link)的 pwd 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136082/