对于我的一个项目,我需要从makefile中添加一些env var。
这是一个沙盒问题:
首先是makefile
all:
$(shell source <(echo export MYVAR=$(MYVAR):otherstuff))
我想要实现的目标
export MYVAR=stuff
make
echo $MYVAR
从技术上讲,MYVAR应该包含东西:其他的东西。但不是这样我得到了bash错误
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `source <(echo export MYVAR=$MYVAR:otherstuff)'
我不知道自己做错了什么,这个命令在makefile之外工作。
谢谢!
答案 0 :(得分:1)
我想要实现的目标
export MYVAR=stuff make echo $MYVAR
从技术上讲,MYVAR应该包含东西:其他的东西。
正如评论中提到的,你无法做到。通过子进程(export MYVAR=stuff
调用)从父进程(您执行make
的shell)继承环境的副本,并且子进程对该变量执行的操作将是可见的make
本身或其自己的子进程。但绝不是父母。
通常,当我需要从Makefile
导出一些信息时,我会为此目的提供特殊目标,例如:
print-env:
@echo export MYVAR=$(MYVAR):otherstuff ";"
@echo export MYOTHERVAR=helloworld ";"
现在当你执行make print-env
时,它会产生如下输出:
export MYVAR=stuff:otherstuff ;
export MYOTHERVAR=helloworld ;
使用makefile我们生成了命令,可以很容易地从输出中复制粘贴到命令提示符中来执行它们。
尽管有可能并且可行,但我建议不要直接将make输出到shell:
eval "`make print-env`"
甚至更激进:
`make print-env`
因为make
输出通常不稳定,并且可能意外地包含其他规则的输出,这可能会混淆shell。