为什么我不能将 bash 命令替换输出存储为变量?

问题描述 投票:0回答:2

我正在编写一个填充配置文件的 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)

我不明白:

  1. 为什么 bash 命令的输出没有存储在变量中。
  2. 为什么执行时会显示输出。我根本没有接触过本地回显,但我不记得其他命令替换(至少使用
    $(COMMAND)
    语法)这样做。

我的目标不是为用户打印变量,但因为我正在调试,我发现有必要。

我是 bash(和 shell)脚本新手,这可能是我一个十足的傻瓜,但希望有人可以帮助我。我认为这是多行输出的错误,但这些两个链接都没有解决我的问题。我什至尝试声明一个数组,其中输出的每一行作为元素,但没有骰子。

我做错了什么对任何人来说都是显而易见的吗?

bash shell sh
2个回答
0
投票

您需要:

settings_output="$(${java_command} -XshowSettings:properties -version 2>&1)"

因为这个

java
命令将输出写入
STDERR


0
投票

-X
选项将其输出写入标准错误,因此它们不会与程序的常规输出混合。这在文档

-X

将额外选项的帮助打印到错误流。

因此将 stderr 重定向到 stdout,以便捕获它。

settings_output="$(${java_command} -XshowSettings:properties -version 2>&1)"
© www.soinside.com 2019 - 2024. All rights reserved.