linux - 终端选项卡中带有符号链接(symbolic link)的 pwd 的奇怪行为

标签 linux bash symlink terminal-emulator pwd

如果我通过创建符号链接(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/

相关文章:

linux - 我如何在 Linux 中创建多级软链接(soft link)或者可以这样做吗?

linux - 在 Bash 中格式化文本输出

linux - MAC 上 Cmd-Right 的 .screenrc 绑定(bind) key

linux - 如何在 linux 中返回文件中第一次出现文本的行号

arrays - 将参数和数组的组合从 linux shell 脚本传递到另一个 shell 脚本

bash - 将简单的 Bash 脚本转换为 PowerShell?

PHP 特殊符号链接(symbolic link)用法

html - 文本空格和制表符分隔表以分号分隔

regex - 用 sed (或类似的)替换前导空格

symlink - ld : library not found for -lgfortran - Mac Symlink issue?