Makefile、Shell和管道是什么?

3
我需要帮助:下面的命令行无法工作。
TESTS := $(shell cat test_cases_file | egrep -v ^\s*(#|$) ) 
all: $(TESTS) 

当我启动时:
make all

我遇到了一个类似于“调用Shell命令未完成”的错误。
2个回答

4

egrep参数中,您缺少引号。如果我是make,我也会认为#是注释的开始。

显然,仅添加引号是不够的,您还需要转义#

编辑: 实际上,$也必须被转义,在make的情况下,可以使用$$来完成。

请尝试以下内容:

TESTS := $(shell egrep -v '^\s*(\#|$$)' test_cases_file) 
all: $(TESTS)

最后,你并不需要舍弃空行 - 这不会有任何影响:

TESTS := $(shell egrep -v '^\s*\#' test_cases_file) 
all: $(TESTS)

为什么我在发帖之前没有看到你的第二部分回答! 无论如何,非常感谢大家。 如果您知道任何好的makefile教程,能否请推荐一下。 - user2725571

0
你可能发现的是,在GNU Make中无法转义括号。您可以通过使用辅助脚本来解决这个问题。
TESTS := $(shell ./grep.sh test_cases_file )
all: $(TESTS)

grep.sh 在哪里:

cat $1 | egrep -v ^\s*(#|$)

1
我相信在某个地方说过...为什么要使用 cat 呢?egrep -v '^\s*(#|$)' $1 这条命令使得整个 grep.sh 都变得不必要了。 - aragaer
@aragaer - 我刚好使用 catgrep。为什么?通常情况下,当表达式在行末时,更改 grep 的表达式会快一点 ;) - kamituel
谢谢! 有没有其他方法可以避免添加grep.sh文件? @aragaer 您能否解释如何转义#?附注:我在这里尝试生成所有目标,具体取决于输入文件行(如果以#开头或为空,则不生成)。 - user2725571
我找到了解决方案。 $$ 表示 $\# 表示 #, 所以我写了:TESTS := $(shell cat test_cases_file | egrep -v "^\s*(\#|$$)" )谢谢。 - user2725571

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接