Linux RPM规范文件宏中的变量和转义?

Linux RPM规范文件宏中的变量和转义?,linux,rpm,rpmbuild,rpm-spec,Linux,Rpm,Rpmbuild,Rpm Spec,我想定义一个宏,用RPM变量(宏)的结果替换makefiles和systemd单位文件中的一些占位符。但是,我不知道扩展的工作方式是否会使以下行为正确: %define repl\u vars()(sed-e“s:\${LIBEXECDIR}:%%{LIBEXECDIR}:g“-e”s:\${LOCALSTATEDIR}:%%{LOCALSTATEDIR}:g“-e”s:\${sysconfdir}:%%{sysconfdir}:g“{1}>%{1}.new&&mv%{1}.new 1}) 其中

我想定义一个宏,用RPM变量(宏)的结果替换makefiles和systemd单位文件中的一些占位符。但是,我不知道扩展的工作方式是否会使以下行为正确:

%define repl\u vars()(sed-e“s:\${LIBEXECDIR}:%%{LIBEXECDIR}:g“-e”s:\${LOCALSTATEDIR}:%%{LOCALSTATEDIR}:g“-e”s:\${sysconfdir}:%%{sysconfdir}:g“{1}>%{1}.new&&mv%{1}.new 1})

其中大写的
${…}
是要替换为标准RPM变量(宏)持有的实际路径的占位符

另外,用
\
转义占位符的
$
在Bash和我放在SPEC文件
%install
部分的东西中都有效,但在宏中仍然有效吗?而且,
%{1}
是否有效,因为我从未见过一个示例——如果没有,我如何将
.new
连接到
%1


如果这是错误的,我该怎么做;博士:是的,我觉得这基本上是正确的。请参阅,以了解一些(有些过时,但仍基本相关)文档

要在等级库文件中的shell上下文中展开的宏只希望展开到您将在等级库文件部分手动编写的文字行

因此,假设您想要达到以下效果:

%install
....
sed -e 's:${LIBEXECDIR}:%{_libexecdir}:g' -e 's:${LOCALSTATEDIR}:%{_localstatedir}:g' -e 's:${SYSCONFIGDIR}:%{_sysconfdir}:g' 'some_file' > 'some_file.new' && mv 'some_file.new' 'some_file'
....
如果要将宏称为
%repl\u vars some\u file
,则需要大致如下所示的宏:

%define repl_vars() sed -e 's:${LIBEXECDIR}:%{_libexecdir}:g' -e 's:${LOCALSTATEDIR}:%{_localstatedir}:g' -e 's:${SYSCONFIGDIR}:%{_sysconfdir}:g' '%{1}' > '%{1}.new' && mv '%{1}.new' '%{1}'

注意,我切换到单引号而不是双引号,以避免对
$
求值和需要转义。我还删除了包装
()
,因为这似乎不需要强制的子shell。

如果使用单引号字符串,则不需要在shell字符串中转义
$
。这些
sed
命令是否只是您希望在
%install
中使用的命令?您将在
%install
部分中使用
%repl\u vars一些文件
?谢谢,这就是我要介绍的。