Shell
帶有外部參數和內部變數的 Makefile 命令
在 Makefile 目標中,我有一個文件列表,我想將這些文件拆分為多個
x
部分並僅使用一個部分y
,然後將這些文件名作為參數傳遞給測試執行器。我無法控制外部參數,因為它們是由 CI 系統提供的。所以我需要手動使它從0開始。範例呼叫:test_group_count=10 test_group=1 make foo
這是我的非工作嘗試:
foo: group_number=$(shell echo $$(( $(test_group) - 1 ))) tests="$(shell ls *.feature | awk 'NR%$(test_group_count)==${group_number}')" run_tests $${tests}
-1
作品_- 列出文件有效,但不能減少到每 y 行
- 將文件名儲存在變數中,然後將其用於下一個命令不起作用
所以我還沒有弄清楚如何讓命令看到兩個變數:我在目標中定義的變數和呼叫命令給出的變數。
更新:
我可以讓它作為一個單線工作,但我更喜歡更具可讀性的東西,因為我的真實
run_tests
本身就是一個長而醜陋的命令:run_tests $$(ls *.feature | awk 'NR%$(test_group_count)==( $(test_group) - 1 )')
您
${group_number}
將被具有該名稱的 make 宏替換。但是它上面的行將它設置為一個 shell 變數(在與你使用它的那個不同的 shell 中;簡單地加倍是$
行不通的)。您應該將其定義為宏——即不在規則中,在非製表符縮進行中。同樣的事情
tests
; 每一行都在不同的 shell 中執行,您不能在它們之間共享變數。工作解決方案:
foo: group_number=$(shell echo $$(( $(test_group) - 1 ))) foo: tests=$(shell ls *.feature | awk 'NR%$(test_group_count)==${group_number}') foo: run_tests ${tests}