我正在“玩耍”并弄乱了 pip(Python 包管理器)的安装。无论如何,事实证明,在我的系统中/bin/pip
是(?)的硬链接/usr/bin/pip
(或者相反,因为我被告知硬链接不知道哪个文件是原始文件)。
$ realpath /bin/pip /usr/bin/pip
/usr/bin/pip
/usr/bin/pip
结果realpath
让我很困惑。如果不知道哪个文件是原始文件,为什么会realpath
显示/usr/bin/pip
而不是/bin/pip
for /bin/pip
?
我知道其中一个可能是硬链接,因为:
$ stat -c "%n is a %F pointing to inode %i, which has %h hard link(s)" /bin/pip /usr/bin/pip
/bin/pip is a regular file pointing to inode 152837, which has 1 hard link(s)
/usr/bin/pip is a regular file pointing to inode 152837, which has 1 hard link(s)
以防万一,我的机器运行的是 CentOS 7,我的 realpath 命令来自 GNU coreutils 8.22。
- - - - 编辑 - - - -
事实上,/bin 是指向 /usr/bin 的符号链接,而 /usr/bin 是常规目录:
$ ls -ld /bin /usr/bin
lrwxrwxrwx. 1 root root 7 May 15 12:49 /bin -> usr/bin
dr-xr-xr-x. 2 root root 53248 Jul 13 18:44 /usr/bin
答案1
我已经测试过这一点,但它不会发生在我身上。我怀疑(如建议的那样)这是由于某个地方的符号链接造成的,因为realpath
解决了这些问题。
尝试:
ls -li /bin/pip /usr/bin/pip
这应该仔细检查两个目录条目是否引用相同的索引节点/文件(直接或间接)。
现在尝试:
ls -ld /bin /usr/bin
这应该显示两个目录(d
在第一列中)。如果其中之一(几乎可以肯定在该列中/usr/bin
显示l
,那么它是一个符号链接,这将解释您所看到的行为(如前所述,realpath
解析符号链接)。
最后澄清:如果其中一个/bin
或/usr/bin
是另一个的符号链接,则将realpath
遵循符号链接到达其目标,并且它将使用该目标作为真实路径。
GNU realpath
(但不是所有其他)有这个--no-symlinks
选择;如果你使用它,你可能会得到你最初期望的结果。