Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile:lazy变量中的shell函数不是lazy_Makefile - Fatal编程技术网

Makefile:lazy变量中的shell函数不是lazy

Makefile:lazy变量中的shell函数不是lazy,makefile,Makefile,考虑下面的Makefile $(shell touch/tmp/example.txt) 文件:=/tmp/example.txt CONTENTS=$(shell cat$(文件);bash-c'echo[debuging id:$$RANDOM]') 冒牌货:全部 全部: @cat$(文件) @回显“$$(内容):”$(内容) bash-c“echo文件内容-$$RANDOM'>$(文件) @cat$(文件) @echo“$$(内容):”$(内容)#此行输出旧内容。为什么? 它打印文件的内

考虑下面的Makefile

$(shell touch/tmp/example.txt)
文件:=/tmp/example.txt
CONTENTS=$(shell cat$(文件);bash-c'echo[debuging id:$$RANDOM]')
冒牌货:全部
全部:
@cat$(文件)
@回显“$$(内容):”$(内容)
bash-c“echo文件内容-$$RANDOM'>$(文件)
@cat$(文件)
@echo“$$(内容):”$(内容)#此行输出旧内容。为什么?
它打印文件的内容,用新内容覆盖并再次打印内容。它显示为(在第二次拍摄
make
之后):

file-contents-1543
$(内容):file-CONTENTS-1543[调试id:15172]
bash-c'echo文件内容-$RANDOM'>/tmp/example.txt
文件-contents-22441
$(内容):file-CONTENTS-1543[调试id:151]
旧内容是
file-contents-1543
,新内容是
file-contents-22441
(数字是随机的),但最后一行
echo$(contents)
不打印新内容。 我认为该命令实际上是调试ID显示的两倍,但lazy变量中的shell函数似乎是在将新内容写入文件之前执行的

我希望每次引用Makefile中的lazy变量时都会对其进行计算,
echo$(CONTENTS)
命令总是打印最新的文件内容。我怎么了

顺便说一下,我发现使用
CONTENTS=$$(cat$(FILE))
的效果与我预期的一样。我将使用这个函数代替shell函数,但它可以吗

我希望每次引用Makefile中的lazy变量时都会对其进行计算,echo$(CONTENTS)命令总是打印最新的文件内容。我怎么了

首先,在make的俚语中,这些变量被称为递归变量,而不是惰性变量。而且,是的,每次使用
$(内容)
引用它们时,它们都会得到扩展(即递归替换)。考虑到
$(eval…
$(shell…
(几乎任何看起来像
$(…)
)的东西)也经历了相同的(递归)扩展过程(尽管有一些“副作用”),此类变量的每次扩展也可能导致某种“评估”或“执行”

接下来,make中的扩展顺序有点特定。特别是,配方(即以[tab]开头的行)在整个makefile(预)处理之后,但在shell执行配方的第一行之前展开。我想这是你困惑的主要原因

我发现使用CONTENTS=$$(cat$(FILE))可以像我预期的那样工作


$
是一种在展开过程后获取单个文本的方法。因此,展开后的
$$(cat$(FILE))
变成
$(cat/tmp/example.txt)
,这是bash中的合法语法。这意味着它只能作为bash命令(配方行)的一部分工作。如果这就是你想要的,那没关系。

谢谢你的回答,它解决了我的问题。扩展是在配方中的命令之前处理的,这是有意义的。我还做了另一个实验,因为文本文件中的日期是最早的日期。