Make
無法從 makefile 中訪問文件
每當我這樣做
for f in data/*; echo $f; done
從終端,它正確輸出每條路徑。
但是,如果我將上述行添加到生成文件中,假設
test: for f in data/*; echo $f; done
然後執行
make test
,而不是輸出文件,它總是輸出一個空字元串。它執行此操作的次數等於目錄中文件/目錄的數量,因此它似乎循環正確。這是為什麼?
編輯:我發現這樣做
$$f
而不是$f
解決問題,但如果我使用time
命令計時,則會導致輸出格式錯誤。編輯 #2:這是 time 命令的範例:
從makefile:
for f in data/ascending_order/*; do time echo $$f; done
data/ascending_order/01/ 0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 804maxresident)k 0inputs+0outputs (0major+232minor)pagefaults 0swaps
從終端
for f in data/ascending_order/*; do time echo $f; done
data/ascending_order/01 real 0m0.001s user 0m0.000s sys 0m0.000s
第一個問題(
echo $f
_$f
_ *_*每個文件都有一個空行。解決方案是通過將它加倍來逃避它,換句話說,使用,在這種情況下,make 將消耗其中一個s 並傳遞外殼 a ,這就是你想要的。echo``$``$$f``$``$f
關於第二個問題(
time
輸出格式),您看到的是 bash built-intime
和 external command之間的輸出格式差異/usr/bin/time
。make 將執行 Makefile 中的命令,將它們傳遞給
/bin/sh
,一些 Linux 發行版(尤其是 Debian 和 Ubuntu)發布指向dash
,這是一個更簡單的 shell,沒有實現內置time
並最終會呼叫外部命令在這種情況下。您可以通過告訴 make 使用 bash 執行 Makefile 中的命令來獲取 bash
time
輸出,您可以在 Makefile 中使用此變數分配來執行此操作:SHELL = /bin/bash