Make

無法從 makefile 中訪問文件

  • November 12, 2018

每當我這樣做

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 中的命令來獲取 bashtime輸出,您可以在 Makefile 中使用此變數分配來執行此操作:

SHELL = /bin/bash

引用自:https://unix.stackexchange.com/questions/481305