Shell
Makefile shell忽略sed正則表達式行尾
我有一個用於各種 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 make
orpinfo make
並蒐索wildcard
andpatsubst
函式。根據您的發行版,您可能需要先安裝make-doc
軟體包(或類似名稱)才能獲得完整的make
文件。
你需要逃避
$
. 在make
中,您可以使用$$
. 你的行應該是:TARGETS = $(shell ls *.c | sed "s/\.c$$//g")
雖然這個直接回答了問題,但@cas 的解決方案似乎更好。