我正在编写一个填充配置文件的 bash 脚本,它需要获取 Java 版本和供应商。我读到获得 Java 供应商的最佳方法是运行
java -XshowSettings:properties -version
。我的计划是使用 bash 正则表达式来获取版本和供应商,但将命令输出存储为变量比我最初想象的要棘手。
这是我的脚本中的代码片段:
settings_output="$(${java_command} -XshowSettings:properties -version)"
echo "Output: ${settings_output}"
运行时,我得到以下输出(省略号用于缩写):
Property settings:
file.encoding = UTF-8
...
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.9+9-Ubuntu-120.04, mixed mode, sharing)
Output:
但我期望得到的是:
Output: Property settings:
file.encoding = UTF-8
...
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.9+9-Ubuntu-120.04, mixed mode, sharing)
我不明白:
$(COMMAND)
语法)这样做。我的目标不是为用户打印变量,但因为我正在调试,我发现有必要。
我是 bash(和 shell)脚本新手,这可能是我一个十足的傻瓜,但希望有人可以帮助我。我认为这是多行输出的错误,但这些两个链接都没有解决我的问题。我什至尝试声明一个数组,其中输出的每一行作为元素,但没有骰子。
我做错了什么对任何人来说都是显而易见的吗?
您需要:
settings_output="$(${java_command} -XshowSettings:properties -version 2>&1)"
因为这个
java
命令将输出写入 STDERR
。
-X
选项将其输出写入标准错误,因此它们不会与程序的常规输出混合。这在文档中
-X
将额外选项的帮助打印到错误流。
因此将 stderr 重定向到 stdout,以便捕获它。
settings_output="$(${java_command} -XshowSettings:properties -version 2>&1)"