【发布时间】: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确实被设置为其他命令或其他东西的输出,而不是静态字符串。