这是一段Makefile代码,说明某人如何在Makefile中使用mktemp
TEST=$(shell mktemp -d)
mktemp:
echo $(TEST)
touch $(TEST)/test.txt
ls $(TEST)
cat $(TEST)/test.txt
rm -rf $(TEST)这是一个示例输出。
❯ make mktemp
echo /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.tQI5EeyW
/var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.tQI5EeyW
touch /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.lVL3N8Rp/test.txt
ls /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.sBW9FzgD
cat /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.Ti53SWSw/test.txt
cat: /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.Ti53SWSw/test.txt: No such file or directory
make: *** [mktemp] Error 1人们期望cat /var/folders/62/wkysd_4n0w57ljl9ycfsd9cc0000gn/T/tmp.Ti53SWSw/test.txt不会出错。
在这种情况下,如何使用mktemp?
发布于 2022-05-06 23:45:36
这一行:
TEST=$(shell mktemp -d)将TEST变量的值设置为字符串$(shell mktemp -d)。它不展开该字符串(不运行shell命令),它只将字符串保持为-原样。
现在,每次在makefile后面使用该值时,都会展开它--这意味着再次运行mktemp,并且得到一个不同的值:
mktemp:
echo $(TEST)
touch $(TEST)/test.txt
ls $(TEST)
cat $(TEST)/test.txt
rm -rf $(TEST)在赋值变量时,希望使用立即扩张,以便在分析makefile时只展开一次;请使用:
TEST := $(shell mktemp -d)或者,您可以使用shell操作编写菜谱,而不使用任何类似于shell的make函数。
mktemp:
TEST=$$(mktemp -d) && \
echo $$TEST && \
touch $$TEST/test.txt && \
ls $$TEST && \
cat $$TEST/test.txt && \
rm -rf $$TEST注意:默认情况下,菜谱的每一行逻辑行都在单独的shell中运行,因此为了让所有的行都在同一个shell中运行(因此它们可以访问相同的$TEST变量),您需要使用反斜杠将它们组合成一个逻辑行。
https://stackoverflow.com/questions/72148362
复制相似问题