在 Bash 脚本中获取 Java 版本结果为空白

在 Bash 脚本中获取 Java 版本结果为空白

我有一个 bash 脚本,它抓取大量环境数据,其中一部分抓取 Unix 机器上的 JDK 位置,然后运行版本检查。出于某种原因,它在某些机器上有效,但在其他机器上无效。但是,通过插入位置手动运行命令没有问题。我在想 java 命令中是否存在延迟,而 bash 脚本没有等待它?

JAVA_HOME="/usr/local/jdk1.7.0_51"

JDK_VERSION=$($JAVA_HOME/bin/java -version 2>&1 | grep 'version' | awk '{gsub(/\"/,""); print $3}' )

但是,如果我从 shell 脚本之外的命令行手动运行它,它就可以工作。

/usr/local/jdk1.7.0_51/bin/java -version 2>&1 | grep 'version' | awk '{gsub(/\"/,""); print $3}'

有任何想法吗?

答案1

出现这种情况的最可能原因是您的 shell 和脚本中的 PATH 环境变量不同。您使用“grep”和“awk”时没有使用绝对路径(即依赖解释器来解析这些工具的位置)。

您可以通过以下几种方式来确认是否确实存在上述情况:

  1. 您可以创建如下脚本:
#!/bin/bash
echo "$PATH"

然后 chmod 0700 并执行它,然后从 shell 会话运行相同的 'echo "$PATH"' 命令。比较两行结果,您很可能会看到差异。

  1. 您可以找到 grep 和 awk 的绝对路径,并更新脚本以使用绝对路径。缺点是脚本的可移植性较差,并且无法在这些工具的位置不同的系统上运行。

答案2

问题是$(cmd)正在执行命令但您没有导出JAVA_HOME

解决办法是

export JAVA_HOME="/usr/local/jdk1.7.0_51"

相关内容