从使用make变量的shell函数返回

cedebl8k  于 2023-04-07  发布在  Shell
关注(0)|答案(1)|浏览(124)

我有下面的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,我也可以接受。

js5cn81o

js5cn81o1#

  1. make recipes是shell脚本,在make recipes中使用shell函数总是错误的。行为是不一样的,因为make在将它们传递给shell之前扩展了recipes,而不是在shell执行它们期间。不要写:
VAR2=$(shell grep -oP "name:\s*\K.+" file2)

写:

VAR2=`grep -oP "name:\s*\K.+" file2`

或者:

VAR2=$$(grep -oP "name:\s*\K.+" file2)

(the需要double $$来避免make在将配方传递给shell之前对其进行扩展)。
1.最好不要用@来静默你的配方,特别是当你调试Makefile的时候。首选等价的make选项或特殊的目标(-s.SILENT与GNU make)。
1.您可能应该引用您的shell扩展(例如,grep -oP "name:\s*\K.+" $$VAR1)中的$${VAR1})。
因此,对于Makefile,您可以尝试以下操作:

.ONESHELL:

# Uncomment the following line when done
#.SILENT:

p3:
    VAR1=`cat meow`
    echo "$${VAR1}"
    VAR2=`grep -oP "name:\s*\K.+" file2`
    echo "$${VAR2}"
    VAR3=`grep -oP "name:\s*\K.+" "$${VAR1}"`
    echo "$${VAR3}"

相关问题