导出某个变量var
,我可以make print-var
,如果我在Makefile中有行:
print-%:
@echo '$*=$($*)'
但是,保存/导出所有变量以进行调试通常更方便。我学会了破解.VARIABLES来做到这一点:
#MAKFILE
TEST1=test var 1
TEST2=\"test var 2\"
#TEST3=`test var'
MAKE_ENV := $(shell echo '$(.VARIABLES)' | awk -v RS=' ' '/^[a-zA-Z0-9]+$$/')
SHELL_EXPORT := $(foreach v,$(MAKE_ENV),$(v)=$($(v))\n)
.PHONY: expvars
expvars:
@echo "$(SHELL_EXPORT)"
print-%:
@echo '$*=$($*)'
这在许多情况下都有效,但是最近我遇到了一个问题,即make变量包含不能出现在sh字符串中的特殊字符。例如,TEST3
。如果我取消注释这一行。会有错误。我该怎么做才能解决这个问题?
如何自动转义这些字符?
@MadScientist,非常感谢。但是您建议的模式仍然不起作用。但是,我使用@echo '$(*)=$(subst ','"'"',$($(*)))'
,这使make print-TEST3
正常工作。但是make
无法正确获取换行符,我猜SHELL_EXPORT中有很多'',它会让整个事情变得混乱:
#MAKFILE
TEST1=test var 1
TEST2=\"test var 2\"
TEST3=`test var'
MAKE_ENV := $(shell echo '$(.VARIABLES)' | awk -v RS=' ' '/^[a-zA-Z0-9]+$$/')
SHELL_EXPORT := $(foreach v,$(MAKE_ENV),'$(v)=$(subst ','"'"',$($(v)))'\n)
.PHONY: expvars
expvars:
# @echo "$(SHELL_EXPORT)" #this cause problem
@echo $(SHELL_EXPORT)
print-%:
@echo '$(*)=$(subst ','"'"',$($(*)))'
最后我像这样解决了这个问题,而不是在最后回复整个事情,我分别回应每一行:
#MAKFILE
TEST1=test var 1
TEST2="test var 2"
TEST3=`test var'
MAKE_ENV := $(shell echo '$(.VARIABLES)' | awk -v RS=' ' '/^[a-zA-Z0-9]+$$/')
SHELL_EXPORT := $(foreach v,$(MAKE_ENV),\
echo $(v)= '$(subst ','"'"',$($(v)))';\
)
.PHONY: expvars
expvars:
@- $(SHELL_EXPORT)
print-%:
@echo '$(*)= $(subst ','"'"',$($(*)))'
答案 0 :(得分:2)
您可以使用'
(单引号)引用整个值,然后使用'"'"'
替换值中的所有单引号,从而编写可靠的“shell引用值”。所以,像这样:
$(v)='$(subst ','"'"',$($(v)))'