我有一个像这样的 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
and var2
可见于task1.csh
and task2.csh
,但除非我将 makefile 更改为:
task1:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task1.csh
task2:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task2.csh
为什么第一种方法不起作用以及如何修复它?
这是行不通的,因为 makefile 规则中的每一行都在其自己的 shell 实例中运行。
来自GNU 制作手册 http://www.gnu.org/software/make/manual/make.html#Execution:
当需要执行配方来更新目标时,将通过为配方的每一行调用一个新的子 shell 来执行它们,除非 .ONESHELL 特殊目标有效(请参阅使用一个 Shell)(在实践中,make 可以采取不影响结果的捷径。)
请注意:这意味着设置 shell 变量和调用 shell 命令(例如设置每个进程本地上下文的 cd)不会影响配方中的以下几行。2 如果要使用 cd 影响下一条语句,请同时放置这两个语句在一个配方行中
因此,您可以按照列出的方式进行操作,或者可以从 make 导出变量,它们已经位于子 shell 的环境中。
export var1 = value1
export var1 = value2
任务1:源任务1.csh
任务2:源任务2.csh
作为旁注,为什么您要采购这些脚本而不是直接运行它们(./task1.sh
)?
(我假设你设置SHELL = csh
或者在你的 makefile 中加入类似的东西来使这个工作已经完成。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)