Shell

在 Makefile 中轉義“所有先決條件”變數

  • September 25, 2021

假設我們有幾個在 shell 中使用時需要引用其名稱的文件:

echo A > 'a.$A'
echo B > 'b.$B'

並且有一個 Makefile,其規則取決於這些文件:

all: a.$$A b.$$B
   cat $+

以上內容適用於名稱簡單的文件,但適用於它生成的範例中的文件:

cat a.$A b.$B
cat: a.: No such file or directory
cat: b.: No such file or directory

看起來 shell 將$Aand$B表達式擴展為​​空字元串。

如果我將變數引用為cat '$+',則會阻止擴展,但所有先決條件都作為單個參數傳遞:

cat 'a.$A b.$B'
cat: 'a.$A b.$B': No such file or directory

根據文件,這是一個單一參數的事實是可以預料的:

所有先決條件的名稱

$$ … $$, 它們之間有空格。

問題是,有沒有辦法將所有先決條件作為單獨的論據來引用它們?

使用 GNU Make,您可以使用模式替換將每個單詞$+用單引號括起來:

all: a.$$A b.$$B
       cat $(patsubst %,'%',$+)

這不適用於包含空格的先決條件,但 Make 無論如何也無法真正處理這些。

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