echo 中的 Makefile 变量赋值错误

Ibr*_*ish 4 makefile

我有这样的文件目标

foo: 
    i = 1
    @echo $(i)
Run Code Online (Sandbox Code Playgroud)

当我像这样运行 make 文件时:

$ make foo 
Run Code Online (Sandbox Code Playgroud)

i = 1
make: i: 命令未找到
Makefile:2: 目标 'foo' 的配方失败
make: [foo] 错误 127

但是如果我不给分配空间(即)

i=1
Run Code Online (Sandbox Code Playgroud)

然后没有错误但没有输出,不打印 i 的值

tri*_*eee 6

第一次尝试运行i带有参数=和的命令2。shell 中的正确赋值在等号两侧没有空格。

您的第二个问题是两条物理线上的配方将运行两个不相关的 shell 实例。第一个将变量设置为一个值,然后退出并丢失该变量。第二个不相关的实例不知道第一个做了什么,当然也没有变量赋值的痕迹。解决方法是在逻辑上将两者合并为一行(只要它们之间有分号,您仍然可以将这些行拆分为多条物理行):

foo: 
    i=1; \
    echo "$${i}"
Run Code Online (Sandbox Code Playgroud)

还要注意我们如何需要将美元符号加倍以防止make解释它们;以及在 shell 中正确使用字符串周围的引号。(在这种特殊情况下,我们知道该字符串不包含任何 shell 元字符;但许多初学者也遇到了这个问题。)

或者,GNU Make 允许您指定.ONESHELL哪些强制在单个 shell 实例中评估配方中的命令;

.ONESHELL:
foo: 
    i=1
    echo "$${i}"
Run Code Online (Sandbox Code Playgroud)


uzs*_*olt 4

在第一种情况下,您指示make运行 shell 命令:i = 1

\n\n

如果你想要一个变量,Makefile你应该设置没有前导空格/制表符。

\n\n

我假设您使用 GNU'smake并且您想要检查食谱语法(或其他类似的语法)make语法):

\n\n
\n

\xe2\x80\x9crule 上下文\xe2\x80\x9d 中的变量定义由制表符缩进\n 作为该行的第一个字符,将被视为\n 配方的一部分,而不是 make 变量定义,并传递给外壳。

\n
\n