来自/ usr / bin / java的Java位置


20

我试图在我的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

这两个命令有什么区别?

Answers:


21

哪两个命令? /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删除链接,就像删除其他文件一样。


5

readlink -f

通过递归地遵循给定名称的每个组件中的每个符号链接来规范化路径;除最后一个组件外的所有组件都必须存在

which将搜索

使用与bash(1)相同的算法获取环境变量PATH中列出的目录中的可执行文件或脚本

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,并且外壳程序已将该路径作为参数插入readlink -freadlink然后查找该路径并发现它是一个符号链接,因此它将解析该链接(及其找到的任何其他链接)以产生指向实际文件本身的完整直接路径。

对于几乎所有目的,这些路径都可以互换使用- java当您使用符号链接时,符号链接将自动解析为真实路径,并且文件本身的修改将由包管理器(而不是您)进行,因此您永远不必看见了。您可以从任一路径或just运行程序java,结果将完全相同,因为它与最后运行的实际可执行文件相同。

程序包管理器将使用符号链接,而不是将实际文件放在其中,/usr/bin因为JRE具有一组其通常希望以不同寻常的配置彼此相邻的文件,并且符号链接使程序包管理器能够呈现正常外观您作为用户。里面还有许多其他文件/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64,您永远都没有理由要处理,并且这些文件不参与系统的常规库安排。


0

此单行命令:

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并返回最后一个。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.