如何在RHEL中安装双jdk时使用shell以编程方式获取jdk安装路径?

zpf6vheq  于 2023-06-24  发布在  Shell
关注(0)|答案(1)|浏览(158)

我有一个服务器列表,我需要在其中以编程方式找到JDK-8的安装位置。一些服务器只有一个jdk安装,这使得使用shell命令readlink -f $(which java)/usr/java找到安装位置变得更容易。但是某些RHEL服务器安装了多个jdk 11和8,alternative --config java将被设置为jdk 11,在这些情况下,使用上面的命令很难得到jdk 8的安装位置。当RHEL服务器中有多个jdk版本安装时,寻求shell脚本来查找jdk安装位置,并适用于单个和多个jdk安装?

fcy6dtqo

fcy6dtqo1#

当RHEL服务器中有多个jdk版本安装时,寻求shell脚本来查找jdk安装位置,并适用于单个和多个jdk安装?
我们不是一个代码编写服务,但我们会给予你的信息和建议,可以帮助你为自己服务。
在使用alternatives系统在多个Java安装之间进行选择的机器上,您可以通过命令alternatives --display java获得有关所有已配置Java替代方案的信息。您还可以通过grep进行过滤,只选择主链接。示例:

[jbolling@random ~]$ alternatives --display java | grep '^/'
/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/bin/java - family java-11-openjdk.x86_64 priority 1
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-3.el8.x86_64/jre/bin/java - family java-1.8.0-openjdk.x86_64 priority 1800362

但是,这已经假设Java 8 JDK可以通过alternatives系统使用,并且在alternatives注册的路径中没有换行符。这就是RHEL包的工作方式,但是如果Java不是通过官方包安装的,那么它可能无法满足这些假设。此外,在安装软件包后,也可以手动注销alternatives条目。
为了超越这一点,您需要做一些额外的假设--具体地说,您可以从路径中识别出您正在寻找的Java安装。如果所有可用的Java安装都是通过官方RHEL包安装的,那么您可以在路径中查找“1.8.0”。因此,我们可以将先前的命令修改为:

[jbolling@random ~]$ alternatives --display java | grep '^/.*1[.]8[.]0'
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-3.el8.x86_64/jre/bin/java - family java-1.8.0-openjdk.x86_64 priority 1800362

如果你想让grep只解析出java命令的路径,那么你可以更进一步:

[jbolling@random ~]$ alternatives --display java | grep -o '^/.*1[.]8[.]0.*bin/java\>'
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-3.el8.x86_64/jre/bin/java

-o选项告诉grep只打印与正则表达式匹配的那部分行。将bin/java添加到模式中(可能)可以防止匹配扩展到注解字段,而\>只是额外的保险,可以确保匹配在单词边界处终止。
但是,这确实会做出额外的假设,即java二进制文件位于名称以bin结尾的子目录中。这是一个相当安全的假设,特别是如果没有来自官方软件包以外的Java安装,但它不是绝对安全的。

相关问题