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.
我想定义一个宏,用 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.