我试图在我的 Linux 系统中找到我的 java 位置并得到这个
[980@b449 ~]$ which java
/usr/bin/java
[980@b449 ~]$ readlink -f $(which java)
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
这两个命令有什么区别?
答案1
哪 2 个命令?
/usr/bin/java
是一个软(符号)链接,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
没有区别,因为它们是同一个文件。
如果你输入类似的内容
ls -l /usr/bin/java
您可能会得到如下结果:
lrwxrwxrwx. 1 root root 22 Aug 5 17:01 /usr/bin/java -> /etc/alternatives/java
这意味着您的系统上可以有多个 java 版本,并使用替代方案来更改默认版本。否则,您只需添加和删除链接即可手动更改默认链接。
要创建符号链接,请使用命令
ln -s /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java /usr/bin/java
或者一般形式
ln -s <original file> <link to file>
并使用rm
删除链接,就像删除任何其他文件一样。
答案2
通过递归地跟踪给定名称的每个组件中的每个符号链接来规范化路径;除最后一个组件外的所有组件都必须存在
对于环境变量 PATH 中列出的目录中的可执行文件或脚本,使用与 bash(1) 相同的算法
which
不关心它找到的是否是符号链接:只关心它是可执行的。它保证它打印的路径始终位于PATH
.
在您的系统上,/usr/bin/java
有一个符号链接到/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
。当您像这样将两个命令组合在一起时代替创建which
命令行的输出:readlink -f
readlink -f /usr/bin/java
也就是说,which
已找到第一个调用的可执行文件java
在您的 中的位置PATH
,并且 shell 已将该路径作为参数插入到 中readlink -f
。readlink
然后查找路径发现它是一个符号链接,因此它解析该链接(以及它找到的任何其他链接)以生成实际文件本身的完整直接路径。
对于几乎所有目的,这些路径都可以互换 -java
当您使用符号链接时,符号链接将自动解析为真实路径,并且对文件本身的修改将由您的包管理器而不是您进行,因此您永远不会看见了。您可以从任一路径运行该程序,或者仅使用 运行该程序java
,结果将完全相同,因为它与最终运行的实际可执行文件相同。
包管理器将使用符号链接而不是将实际文件放入其中,/usr/bin
因为 JRE 有一整套文件,它喜欢在不寻常的配置中彼此相邻,并且符号链接可以让包管理器呈现出正常的排列作为用户的你。里面还有许多其他文件/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
,您永远没有任何理由要处理这些文件,并且它们不参与系统的普通库安排。
答案3
这个单行命令:
which java | xargs readlink -f
将为您完成这项工作。
which java
给你即:/usr/bin/java
readlink -f
遍历所有符号链接/usr/bin/java
->/etc/alternatives/java
->/usr/lib/jvm/java-8-oracle/jre/bin/java
并返回最后一个。