我有一个 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”时没有使用绝对路径(即依赖解释器来解析这些工具的位置)。
您可以通过以下几种方式来确认是否确实存在上述情况:
- 您可以创建如下脚本:
#!/bin/bash echo "$PATH"
然后 chmod 0700 并执行它,然后从 shell 会话运行相同的 'echo "$PATH"' 命令。比较两行结果,您很可能会看到差异。
- 您可以找到 grep 和 awk 的绝对路径,并更新脚本以使用绝对路径。缺点是脚本的可移植性较差,并且无法在这些工具的位置不同的系统上运行。
答案2
问题是$(cmd)
正在执行命令但您没有导出JAVA_HOME
。
解决办法是
export JAVA_HOME="/usr/local/jdk1.7.0_51"