2

Example RPM macro:

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

I would like to be able to give it macros with spaces in it, as in:

%{hello "Dak Tyson"}

->

printf 'hello, Dak Tyson.\n'

However, it keeps doing this:

%{hello "Dak Tyson"}

->

printf 'hello, "Dak.\n'

In other words, it doesn't interpret the double quotes, but uses them as-is.

Single quotes don't work either:

%{hello 'Dak Tyson'}

->

printf 'hello, 'Dak\.\n'

Nor backslashes:

%{hello Dak\ Tyson}

->

printf 'hello, Dak\.\n'

Nor braces:

%{hello {Dak Tyson}}

->

printf 'hello, {Dak.\n'

Is there any way to give an RPM macro arguments with spaces?

4

1 回答 1

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< '
'
于 2013-10-15T18:10:32.780 回答