RPM spec文件中BASH大括号展开失效问题及优化咨询
问题解答
1. 两种展开差异的原因及修复方案
差异原因
RPM宏的大括号展开逻辑和Bash原生展开不完全一致:
- 你的
template_list结构是template{,_{AFC,AIC,...}},所有元素都是纯字母数字加下划线,RPM解析器可以无歧义地识别嵌套大括号的展开规则,顺利完成字符串拼接。 - 而
include_list中的元素包含连字符(-),RPM会把带连字符的字符串(比如account-changed)误判为宏语法的一部分,或者在解析双层大括号展开时触发优先级冲突,导致直接报错;加双引号后,RPM会把整个内容当作单一字符串,不会触发大括号展开,因此无法得到预期的列表。
修复方案
使用%expand宏强制触发Bash风格的大括号展开,告诉RPM把内部内容当作纯字符串展开,而非宏语法解析:
%define include_list %{expand: {account-changed,details,lastbind,notification,ppolicy,report-time,template}{,-DE}.incl}
或者拆分定义,先声明基础列表再拼接,可读性更强:
%define incl_files account-changed details lastbind notification ppolicy report-time template %define include_list %{expand: %{foreach file in %{incl_files}: %{file}.incl %{file}-DE.incl}}
2. 长列表拆分多行的正确方式
方式一:直接换行(用反斜杠续行)
适合手动列出所有元素的场景,清晰直观:
%define template_list \ template \ template_AFC \ template_AIC \ template_ALC \ template_CCT \ template_CRC \ template_GLC \ template_ILC \ template_LPE \ template_PPI \ template_PPO \ template_PWC \ template_SPE
注意反斜杠后不能有多余空格,否则会被当作字符串的一部分。
方式二:大括号展开时换行
如果仍想保留大括号展开的简洁性,可以在大括号内用反斜杠换行:
%define template_list template{,_\ AFC,\ AIC,\ ALC,\ CCT,\ CRC,\ GLC,\ ILC,\ LPE,\ PPI,\ PPO,\ PWC,\ SPE\ }
确保每个逗号紧跟元素,换行后不破坏大括号的展开逻辑。
方式三:使用%foreach批量生成
对于有规律的列表,结合%foreach和基础列表拆分多行:
%define template_suffixes \ AFC \ AIC \ ALC \ CCT \ CRC \ GLC \ ILC \ LPE \ PPI \ PPO \ PWC \ SPE %define template_list %{expand: template %{foreach sfx in %{template_suffixes}: template_%{sfx}}}
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

