给 RPM 宏一个带空格的参数

问题描述 投票:0回答:2

RPM 宏示例:

%define hello() \
    printf 'hello, %{1}.\\n';

我希望能够为其提供带有空格的宏,如下所示:

%{hello "Dak Tyson"}

->

printf 'hello, Dak Tyson.\n'

但是,它一直这样做:

%{hello "Dak Tyson"}

->

printf 'hello, "Dak.\n'

换句话说,它不会解释双引号,而是按原样使用它们。

单引号也不起作用:

%{hello 'Dak Tyson'}

->

printf 'hello, 'Dak\.\n'

也没有反斜杠:

%{hello Dak\ Tyson}

->

printf 'hello, Dak\.\n'

也没有大括号:

%{hello {Dak Tyson}}

->

printf 'hello, {Dak.\n'

有什么方法可以给 RPM 宏参数添加空格吗?

macros rpm rpmbuild rpm-spec
2个回答
4
投票

我仔细研究了与宏扩展有关的RPM API C代码。我在那里发现了一个循环,它使用空格来解析参数,并且(我认为)没有办法绕过这个循环。我认为你不能用空格给出参数。

不过,我确实发现宏参数是安全的。

我的

.rpmmacros
文件:

%hello() '%{1}'
%name Dak Tyson

定义上述宏后,此命令:

rpm --eval '%{hello %{name}}'

产量:

'Dak Tyson'

因此,如果我确实需要在宏定义中使用空格,我可以先将它们定义为宏。

顺便说一句,我还发现嵌套参数化宏不起作用。

这个命令:

rpm --eval '%{hello %{hello name}}'

产量:

error: Unterminated {: {hello
  2<     (empty)
  1<   (empty)
  0< '
'

0
投票

自 RPM 4.14 起,出现了

quote
。 以你的例子来说,

%{hello %{quote:Dak Tyson}}
© www.soinside.com 2019 - 2024. All rights reserved.