如何在Makefile规则中传递Python脚本返回的Shell变量至另一脚本
解决Makefile中Shell变量传递问题
你的问题核心是混淆了Make解析阶段和Shell执行阶段的变量作用域,以下是修正后的写法:
MyRule: export VAR=$$(python.exe mySkript1.py someInputs); \ echo $$VAR; \ python.exe mySkript2.py someInputs2 "$$VAR"; \ echo $$VAR
关键说明:
- 用
$$(...)替代$(shell ...):Make中$需要转义为$$才能传递给Shell,$$(python ...)会让Shell执行Python脚本并将输出赋值给VAR。 - 保持命令在同一Shell进程:所有命令用
\连接,确保VAR变量在整个规则执行过程中有效(如果分开成不同行不加\,每个命令会在独立Shell进程中运行,变量无法共享)。 - 传递变量时用
"$$VAR":转义后的$VAR是Shell变量,加双引号可以处理输出包含空格、特殊字符的情况。
为什么之前的写法无效:
$(shell ...)是Make在解析Makefile时就会执行的操作,此时规则里的Shell命令还未运行,VAR变量根本不存在。- 你尝试的
$VAR是Make变量(不是Shell变量),$$VAR如果放在$(shell ...)里,Make解析时会把$$VAR转成$VAR,但此时Make变量VAR未定义,传递给Python脚本的是空值;$(VAR)同样是引用Make变量,结果也是空。
内容的提问来源于stack exchange,提问作者user19471767
相关产品推荐
相关产品推荐

