編輯:
由下面的真棒答案解決。使用 := 而不是 = 展開變數
mktemp: TEST:=$(shell mktemp -d)
mktemp:
echo $(TEST)
touch $(TEST)/test.txt
ls $(TEST)
cat $(TEST)/test.txt
rm -rf $(TEST)
原始問題:
這是一段關于某人如何在 Makefile 中使用 mktemp 的 Makefile 代碼
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?
uj5u.com熱心網友回復:
這一行:
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 操作撰寫配方,而不使用任何 make 函式,例如shell:
mktemp:
TEST=$$(mktemp -d) && \
echo $$TEST && \
touch $$TEST/test.txt && \
ls $$TEST && \
cat $$TEST/test.txt && \
rm -rf $$TEST
請注意,默認情況下,配方的每個邏輯行都在單獨的 shell 中運行,因此為了讓所有行在同一個 shell 中運行(因此它們可以訪問相同的$TEST變數),您需要使用反斜杠將它們組合成一個邏輯線。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471513.html
上一篇:從while回圈更新全域變數
下一篇:bash中的決議串列
