如何配置 bash 以始终解析符号链接的完整路径

如何配置 bash 以始终解析符号链接的完整路径

链接到的答案实际上并没有像接受的答案那样回答我的问题。Google 仅指向其他答案,而这些答案实际上并不是针对此特定问题的答案。


当通过符号链接访问目录时,bashshell 会试图让用户误以为该符号链接是一个真实目录。然而,在很多情况下,这种做法并不奏效。例如,考虑一下我可能会遇到的情况:

/usr/local/src/project-a-1.0/
/usr/local/src/project-b-2.2/

然后,我的主目录中有一个符号链接:

ln -s /usr/local/src/project-a-1.0 ~/project

现在,我想快捷地使用project-a

cd ~/project

到目前为止,一切都很好——但是 bash 假装我实际上在 中~/project,而不是在实际的工作目录中。它甚至在使用内置时也会假装pwd,但在使用可执行文件时当然不会假装/bin/pwd

现在,如果我想检出 中的文件project-b,我可能想尝试vim ../project-b<TAB>使命令完成工作。但是,bash拒绝完成此操作,因为它认为这..是包含用户主目录的目录。

但是,如果我输入的vim ../project-b-2.2/somefile.txt话,它就可以正常工作,这正是我所期望的。

符号链接不是目录,由于 bash 中的这个错误功能,各种不便甚至错误都会发生。我试图搜索关闭此功能的选项,但所有谷歌和超级用户点击都只是关于“如何手动解析链接路径”——这不是我想要的;我希望 bash 停止尝试在我的文件系统上模拟文件系统,这很糟糕。当然,存在一些选项可以将正确性置于幻想之前?

“类似问题”弹出窗口指向 Google 已经发送给我的另外两个问题;这两个问题都要求我传递“-P”选项,pwd或者cd甚至建议使用readlink来确定符号链接目标。这根本不是我感兴趣的。我希望内置pwd和 shell 提示符与系统调用$PWD的物理输出相匹配getcwd();这些问题根本没有谈到这一点。

答案1

shell 范围的选项为了这:

-P

如果设置,则在执行更改当前目录的命令时不解析符号链接 cd。而是使用物理目录。默认情况下,Bash 在执行更改当前目录的命令时遵循目录的逻辑链。

例如,如果 /usr/sys 是 /usr/local/sys 的符号链接,则:

$ cd /usr/sys; echo $PWD
/usr/sys
$ cd ..; pwd
/usr

如果set -P是,则:

$ cd /usr/sys; echo $PWD
/usr/local/sys
$ cd ..; pwd
/usr/local

所以这应该会让你得到你想要的行为:

set -P

答案2

这可能不是您想听到的,但我认为文件的规范路径的想法是有缺陷的。

首先,如果你创建一个到现有文件的硬链接,那么现在实际上同一文件的两个不同路径:

$ cd "$(mktemp --directory)"
$ touch foo
$ ln foo bar
$ ls --inode 
1223418 bar  1223418 foo

这两者之间没有“原创”,除了名称之外,它们保留了相同的元数据:

$ touch --date='2001-02-03 04:05:06.789' bar
$ ls -lA
total 0
[…] Feb  3  2001 bar
[…] Feb  3  2001 foo

其次,根据上下文,引用文件的方式有很多种:

  • 硬链接或符号链接的相对路径
  • 到硬链接或符号链接的绝对路径(如上所示,有多个)
  • file:///absolute/path/to/file 或其他协议

所有这些在不同情况下都是有用的。

第三,Bash 没有“假装”任何事情;这不是幻觉,您确实在那个目录中。它是一个符号链接,这一事实对于您用它执行的几乎所有操作来说都应该是透明的。

第四,符号链接与 Bash 无关;它们是文件系统功能,与任何 shell、终端甚至操作系统都无关。每个主要文件系统都有它们,因此尝试忽略它们可能会阻碍你,而不是帮助你。

最后,任何工具如果在没有明确告知的情况下对符号链接进行特殊处理,则应该固定的,因为它有一个漏洞

相关内容