我有下面的makefile
.ONESHELL:
p3:
@VAR1=$(shell cat meow) # first file
@echo "$${VAR1}"
@VAR2=$(shell grep -oP "name:\s*\K.+" file2)
@echo "$${VAR2}"
# @VAR3=$(shell grep -oP "name:\s*\K.+" $${VAR1})
# @echo "$${VAR3}"
然后呢
echo -e "file2" > meow
echo -e "name: My_Name" > file2
当我运行make p3
时,我看到:
$ make p3
file2
My_Name
但是,我真正想要的不是在makefile中硬编码“file2”,而是从'meow'文件的内容中接收它。
当我取消对$${VAR1}
调用的行的注解时,程序无限期地挂起。似乎也没有办法转义该变量,$VAR1
,$$VAR1
,$(VAR1)
,$$(VAR1)
,${VAR1}
,$${VAR1}
都失败了。
如何从使用make变量的shell函数中获取返回值?如果这需要define
,我也可以接受。
1条答案
按热度按时间js5cn81o1#
shell
函数总是错误的。行为是不一样的,因为make在将它们传递给shell之前扩展了recipes,而不是在shell执行它们期间。不要写:写:
或者:
(the需要double
$$
来避免make在将配方传递给shell之前对其进行扩展)。1.最好不要用
@
来静默你的配方,特别是当你调试Makefile的时候。首选等价的make选项或特殊的目标(-s
和.SILENT
与GNU make)。1.您可能应该引用您的shell扩展(例如,
grep -oP "name:\s*\K.+" $$VAR1)
中的$${VAR1}
)。因此,对于Makefile,您可以尝试以下操作: