Shell
在 Makefile 中轉義“所有先決條件”變數
假設我們有幾個在 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 將
$A
and$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 無論如何也無法真正處理這些。