【问题标题】:Give RPM macro an argument with spaces给 RPM 宏一个带空格的参数
【发布时间】:2023-10-05 07:24:01
【问题描述】:

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


    【解决方案1】:

    我搜索了与macro expansion 相关的RPM API C code。我在那里找到了一个循环,它使用空格来解析参数,并且(我认为)没有办法绕过这个循环。我认为你不能用空格给出论点。

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

    我的.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< '
    '
    

    【讨论】:

    • IJWTS 感谢您通读 RPM 源代码,这样我就不必阅读了。
    最近更新 更多