在我的 Makefile 配方之一中,我想創建一個臨時檔案,將該檔案的名稱傳遞給 shell 命令并將該命令的輸出分配給一個 make 變數,以便我隨后可以使用它。對于我的生活,我無法讓它發揮作用。
出于除錯的目的,我試圖將問題歸結為我能想到的最簡單的目標:
.PHONY: foo
foo:
$(eval TMPFILE = $(shell mktemp -p ./))
dd if=/dev/random of=${TMPFILE} bs=1 count=512
$(eval FOO = $(shell wc -c ${TMPFILE}))
@echo FOO: ${FOO}
這是發生的事情:
? make foo
dd if=/dev/random of=./tmp.K1au4WrZ76 bs=1 count=512
512 0 records in
512 0 records out
512 bytes copied, 0.00287818 s, 178 kB/s
FOO: 0 ./tmp.K1au4WrZ76
所以不知何故,wc認為檔案是空的。但是當我檢查 TMPFILE 時,它有 512 個位元組,正如預期的那樣:
? wc -c tmp.K1au4WrZ76
512 tmp.K1au4WrZ76
有人可以請教我這里發生了什么以及如何正確地做到這一點?
謝謝菲爾
更新:根據答案,我將這個目標組合在一起,按需要作業:
.PHONEY: foo
.ONESHELL:
foo:
set -e
TMPFILE=`mktemp -p ./`
dd if=/dev/random of=$$TMPFILE bs=1 count=512
FOO=`wc -c $$TMPFILE`
@echo FOO: $$FOO
謝謝!
uj5u.com熱心網友回復:
Make 總是首先展開整個配方(配方的所有行),然后再啟動任何 shell 命令。因此eval,在運行任何 shell 命令(例如 )之前,將呼叫所有等操作dd。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/401808.html
