你如何使用 mktemp 在 Makefile 中创建目录?
How do you use mktemp to create directory in Makefile?
这是一段 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?
这一行:
TEST=$(shell mktemp -d)
将 TEST
变量的值设置为字符串 $(shell mktemp -d)
。它不扩展该字符串(不 运行 shell 命令),它只保留字符串 as-is.
现在,每次您稍后在 makefile 中使用该值时,它都会扩展,这意味着 mktemp
又是 运行,并且您会得到一个不同的值:
mktemp:
echo $(TEST)
touch $(TEST)/test.txt
ls $(TEST)
cat $(TEST)/test.txt
rm -rf $(TEST)
你想在给变量赋值的时候使用immediate expansion,这样在解析makefile的时候只扩展一次;使用:
TEST := $(shell mktemp -d)
或者,您可以只使用 shell 操作编写配方,而不使用任何 make 函数,例如 shell
:
mktemp:
TEST=$$(mktemp -d) && \
echo $$TEST && \
touch $$TEST/test.txt && \
ls $$TEST && \
cat $$TEST/test.txt && \
rm -rf $$TEST
请注意,默认情况下,配方的每个逻辑行 运行 在单独的 shell 中,因此为了让所有行 运行 在同一个 shell 中(因此他们可以访问相同的 $TEST
变量)您需要使用反斜杠将它们组合成一个逻辑行。
这是一段 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?
这一行:
TEST=$(shell mktemp -d)
将 TEST
变量的值设置为字符串 $(shell mktemp -d)
。它不扩展该字符串(不 运行 shell 命令),它只保留字符串 as-is.
现在,每次您稍后在 makefile 中使用该值时,它都会扩展,这意味着 mktemp
又是 运行,并且您会得到一个不同的值:
mktemp:
echo $(TEST)
touch $(TEST)/test.txt
ls $(TEST)
cat $(TEST)/test.txt
rm -rf $(TEST)
你想在给变量赋值的时候使用immediate expansion,这样在解析makefile的时候只扩展一次;使用:
TEST := $(shell mktemp -d)
或者,您可以只使用 shell 操作编写配方,而不使用任何 make 函数,例如 shell
:
mktemp:
TEST=$$(mktemp -d) && \
echo $$TEST && \
touch $$TEST/test.txt && \
ls $$TEST && \
cat $$TEST/test.txt && \
rm -rf $$TEST
请注意,默认情况下,配方的每个逻辑行 运行 在单独的 shell 中,因此为了让所有行 运行 在同一个 shell 中(因此他们可以访问相同的 $TEST
变量)您需要使用反斜杠将它们组合成一个逻辑行。