为何无法将Bash命令替换的输出存储为变量?
问题原因与解决方案
核心问题:输出流向的差异
java -XshowSettings:properties -version命令的输出分为两类流向:
XshowSettings:properties的配置信息输出到标准输出(stdout)-version的版本信息输出到标准错误(stderr)
Bash的命令替换$(...)默认只捕获stdout的内容,stderr的内容会直接打印到终端,不会被存入变量。这就是你看到命令输出直接显示、变量为空的根本原因。
解决方法:合并输出流向
修改命令替换部分,把stderr的内容重定向到stdout,让命令替换能捕获所有输出:
settings_output="$(${java_command} -XshowSettings:properties -version 2>&1)" echo "Output: ${settings_output}"
这里的2>&1是Bash重定向语法:2代表stderr,1代表stdout,该操作将stderr的内容合并到stdout中,这样所有输出都会被存入变量。
提取Java版本和厂商的实用技巧
既然已经捕获了完整输出,你可以直接从配置属性中提取标准的版本和厂商信息,比解析版本字符串更可靠:
# 提取Java版本 java_version=$(echo "$settings_output" | grep '^ java.version = ' | awk -F ' = ' '{print $2}') # 提取Java厂商 java_vendor=$(echo "$settings_output" | grep '^ java.vendor = ' | awk -F ' = ' '{print $2}') echo "Java版本: $java_version" echo "Java厂商: $java_vendor"
内容的提问来源于stack exchange,提问作者Jacusaurus
相关产品推荐
相关产品推荐

