我想了解如何正确测试shell输出的值。这是我的代码:
DB := my_database
WORKING_SCHEMA := toto
export WORKING_SCHEMA
check_working_schema = $(shell echo "SELECT EXISTS ( \
SELECT 1 FROM pg_catalog.pg_namespace \
WHERE nspname = :'sel_schema'\
); " | psql -d $(DB) -q -t -A --variable sel_schema=$$1)
$(info $(check_working_schema))
.PHONY: rule1
rule1 :
ifeq "$(eval $(call check_working_schema, $(WORKING_SCHEMA)))" "t"
$(info in true part)
else
$(info in false par)
endif
测试未通过,我不知道错误在哪里。
这里有很多误解。要理解的最重要的事情是,当使make evaluates eval
函数时,该评估的结果是空字符串。 Eval用于解释make语法...它有点像make include
语句,除了代替文件以外,它还“包含”字符串。
所以说类似:
ifeq "$(eval ...)" "t"
永远不会起作用,因为第一个子句始终是空字符串。
接下来要意识到的是,如上所述,eval
希望获得makefile语法。但是call
函数的结果将是psql
语句的输出,这绝对不是makefile语法。
我不确定您为什么在这里使用eval
。为什么不使用:
ifeq "$(call check_working_schema, $(WORKING_SCHEMA))" "t"
?