Shell

Makefile shell忽略sed正則表達式行尾

  • November 1, 2015

我有一個用於各種 C 程式碼測試的文件夾,其中包含許多名為*.c. 我的目標是讓 Makefile 搜尋任何以結尾的文件名.c並將該文件名的根添加到目標中。

Makefile:

TARGETS = $(shell ls *.c | sed "s/\.c$//g")
all: $(TARGETS)

問題是 shell 命令在 sh 中按預期工作:

$ sh -c 'ls *.c | sed "s/\.c$//g"'
hello

…雖然它失敗了make

$ make
sed: 1: "s/\.c/g": unterminated substitute in regular expression
make: Nothing to be done for `all'.

我嘗試轉義$as \$,而是產生:

`sed: 1: "s/\.c\/g": unterminated substitute pattern`

"用單引號 ( )替換雙引號 ( ) 也是如此'

使用 GNU Make:

objects := $(patsubst %.c,%.o,$(wildcard *.c))

all : $(objects)

有關詳細資訊,請參閱info makeorpinfo make並蒐索wildcardandpatsubst函式。根據您的發行版,您可能需要先安裝make-doc軟體包(或類似名稱)才能獲得完整的make文件。

你需要逃避$. 在make中,您可以使用$$. 你的行應該是:

TARGETS = $(shell ls *.c | sed "s/\.c$$//g")

雖然這個直接回答了問題,但@cas 的解決方案似乎更好。

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