我有这样的文件目标
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 的值
第一次尝试运行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)