RPM SPEC 文件宏中的变量和转义?

Variables and escaping in RPM SPEC file macros?

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

%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})

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

此外,使用 \ 转义占位符的 $ 在 Bash 和我放入 SPEC 文件的 %install 部分的内容中有效,但那是在宏中仍然有效? %{1} 是否有效,因为我从未见过示例——如果不是,我如何将 .new 连接到 %1

如果这是错误的,我该怎么办?

tl;dr 是的,这对我来说基本上是正确的。请参阅 http://www.rpm.org/wiki/PackagerDocs/Macros 了解一些(有些过时但仍然很相关的)文档。

要在 spec 文件的 shell 上下文中扩展的宏只想扩展到您将手动写入 spec 文件部分的文字行。

所以假设你想要一些效果:

%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_vars some_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.