Answers:
哪两个命令?
/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
删除链接,就像删除其他文件一样。
通过递归地遵循给定名称的每个组件中的每个符号链接来规范化路径;除最后一个组件外的所有组件都必须存在
使用与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 -f
。readlink
然后查找该路径并发现它是一个符号链接,因此它将解析该链接(及其找到的任何其他链接)以产生指向实际文件本身的完整直接路径。
对于几乎所有目的,这些路径都可以互换使用- java
当您使用符号链接时,符号链接将自动解析为真实路径,并且文件本身的修改将由包管理器(而不是您)进行,因此您永远不必看见了。您可以从任一路径或just运行程序java
,结果将完全相同,因为它与最后运行的实际可执行文件相同。
程序包管理器将使用符号链接,而不是将实际文件放在其中,/usr/bin
因为JRE具有一组其通常希望以不同寻常的配置彼此相邻的文件,并且符号链接使程序包管理器能够呈现正常外观您作为用户。里面还有许多其他文件/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
,您永远都没有理由要处理,并且这些文件不参与系统的常规库安排。
此单行命令:
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
并返回最后一个。