RPM Spec文件%post段无法将输出捕获到变量的问题
解决RPM Spec %post段捕获程序输出到变量的问题
你的问题出在脚本格式和执行上下文的处理上,我来帮你拆解问题并给出可行的修复方案:
原写法的核心问题
你把%post和命令写在了同一行,RPM会将整行当作%post的参数处理,而非执行你预期的shell脚本逻辑。即便能写入临时文件,后续的变量赋值也因为执行上下文的问题无法正确获取内容。
修复方案1:使用临时文件的正确写法
将%post单独占一行,后续脚本按标准shell格式编写:
%post # 执行程序,同时将输出(含stderr)写入临时文件并打印到终端 /var/tmp/%{_installer_file} |& tee /var/tmp/status.txt # 读取临时文件内容到变量,推荐用$(...)替代反引号,兼容性和可读性更好 STATUS=$(cat /var/tmp/status.txt) # 输出变量内容验证结果 echo "------------ status = $STATUS" # 可选:清理临时文件,避免系统残留 rm -f /var/tmp/status.txt
修复方案2:无需临时文件,直接捕获输出
更高效的方式是跳过临时文件,直接在捕获变量的同时保留终端输出,还能避免文件权限或清理的麻烦:
%post # 合并stdout和stderr,用tee输出到终端的同时,将结果存入变量 # 若系统默认shell不支持|&,替换为2>&1 |即可兼容POSIX标准 STATUS=$(/var/tmp/%{_installer_file} |& tee /dev/fd/1) echo "------------ status = $STATUS"
方案2的原理说明
|&(bash语法)会将程序的stdout和stderr合并到管道中,换成2>&1 |可兼容所有POSIX shelltee /dev/fd/1会把管道内容输出到当前shell的标准输出,保证你能看到程序的原始输出- 命令替换
$(...)会捕获整个管道的输出,直接存入STATUS变量
额外注意事项
- 确保
%post段的所有脚本内容是作为一个完整的shell脚本执行的,不要拆分单独的%post行 - 如果你的RPM构建环境默认使用sh而非bash,务必将
|&替换为2>&1 |,避免语法错误
内容的提问来源于stack exchange,提问作者Krishna G
相关产品推荐
相关产品推荐

