Shell

帶有外部參數和內部變數的 Makefile 命令

  • July 16, 2019

在 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}

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