链接到的答案实际上并没有像接受的答案那样回答我的问题。Google 仅指向其他答案,而这些答案实际上并不是针对此特定问题的答案。
当通过符号链接访问目录时,bash
shell 会试图让用户误以为该符号链接是一个真实目录。然而,在很多情况下,这种做法并不奏效。例如,考虑一下我可能会遇到的情况:
/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、终端甚至操作系统都无关。每个主要文件系统都有它们,因此尝试忽略它们可能会阻碍你,而不是帮助你。
最后,任何工具如果在没有明确告知的情况下对符号链接进行特殊处理,则应该固定的,因为它有一个漏洞。