【问题标题】:Makefile subst variable not affected?Makefile subst 变量不受影响?
【发布时间】:2015-03-02 18:43:48
【问题描述】:

我想在我的 Makefile 中执行字符串替换。我可以使用这样的字符串文字轻松地做到这一点:

foo:
    echo $(subst /,-,"hello/world")

产生预期的结果:

hello-world

但是当我切换到使用变量时,我似乎无法坚持使用替换:

foo:
    x="hello/world" ; \
    echo $(subst /,-,$$x)

我没有用破折号替换斜线,而是将原始字符串打印回来。有人可以解释这里发生了什么吗?变量是否需要显式转换为字符串字面量之类的?

更新:

基于 MadScientist 答案的修复——这将允许我将修改后的字符串作为变量引用。

foo:
    x="hello/world" ; \
    y=`echo $$x | tr / -` ; \
    echo $$y

但比起echo $$y,这可能更有用。

【问题讨论】:

  • 我不知道您所说的“在后续命令中”究竟是什么意思,但如果您的意思是在不同的配方中,这将不起作用。每个配方的每个逻辑行都在单独的 shell 实例中运行。每次 shell 退出时,它设置的所有变量(甚至导出的变量)都会丢失:shell 无法修改调用它的进程(在本例中为 make)的环境或变量。
  • 我的意思是,如果您想通过将结果替换设置为变量并像我在更新中回显新变量一样使用它来使用结果替换。不在另一个 make 块中,等等
  • 在这种简单的情况下,您可以只写x=$(subst /,-,"hello/world") ; echo $$x,但大概x 确实被设置为其他命令或其他东西的输出,而不是静态字符串。

标签: bash makefile subst


【解决方案1】:

您不能将 make 函数与 shell 变量组合...所有 make 函数都先展开,然后将生成的脚本传递给 shell 以运行。当 shell 获取脚本时,其中没有更多的 make 函数(如果有,shell 将不知道如何处理它们!)

您的 subst 在文字字符串 $x 上运行,它没有 /,因此没有可替换的内容并导致 $x,shell 将其扩展为字符串 hello/world

如果您必须处理 shell 变量值,则必须使用 shell 命令,例如 sedtr,而不是 make 的 subst 函数:

foo:
        x="hello/world" ; \
        echo $$x | tr / -

【讨论】:

  • 感谢您为我解决这个问题!我正在学习一些关于 Make/bash 的速成课程。
【解决方案2】:

您可以将x 定义为make 变量:

生成文件

x = foo bar baz

t:
    @echo $(subst bar,qux,$(x))

输出

make                                                                                                                                                                                                                                                     
foo qux baz

版本

make --version                                                                                                                                                                                                                                           
GNU Make 3.81   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多