我有一个这样的makefile:
setup:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)";
task1: setup
source task1.csh
task2: setup
source task2.csh
我使用以下命令调用makefile:
make var1=value1 var2=value2 task1
我希望环境变量var1
和var2
在task1.csh
和task2.csh
中可见,但除非我改变,否则我无法做到这一点makefile:
task1:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task1.csh
task2:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task2.csh
为什么第一种方法不起作用,我该如何解决?
答案 0 :(得分:6)
这不起作用,因为makefile规则中的每一行都在自己的shell实例中运行。
当需要执行配方来更新目标时,它们是通过为配方的每一行调用一个新的子shell来执行的,除非.ONESHELL特殊目标生效(参见使用一个Shell)(在实践中) ,make可能会采取不影响结果的捷径。)
请注意:这意味着设置shell变量并调用shell命令(例如cd,为每个进程设置本地上下文)不会影响配方中的以下行.2如果要使用cd来影响下一个语句,将两个陈述放在一个食谱行中
所以你可以按照你列出的方式做到,或者你可以从make导出变量,它们将在子shell的环境中。
export var1 = value1
export var1 = value2
任务1: source task1.csh
TASK2: source task2.csh
作为旁注,为什么要采购这些脚本而不是直接运行它们(./task1.sh
)?
(我假设您在makefile中设置SHELL = csh
或类似内容,以使其完全正常工作。)