如何在 Makefile 规则中将 env 变量传递给 shell 脚本
Posted
技术标签:
【中文标题】如何在 Makefile 规则中将 env 变量传递给 shell 脚本【英文标题】:How to Pass env variable to a shell script within Makefile rule 【发布时间】:2019-07-29 06:42:42 【问题描述】:我在 Makefile 中有一条规则,它尝试使用 env 变量呈现一些文本,每当我将它传递给 $(shell) 命令时,我总是将这个变量设为空
以下是我试图传递环境变量的 Makefile 我正在使用 sqoop 从运行在 where 语句中定义日期的查询的 sql server 获取数据
SHELL := /bin/bash
ifndef DATE
override DATE=$(shell date --date="1 day ago" +%Y%m%d)
endif
test:
sqoop --target-dir /tmp/output/ --fields-terminated-by '\t' --split-by id --query '$(shell cat query.sql | env DATE=$(DATE) python -m mypackage.render)'
我运行类似make test DATE=20190728
的命令
当我传递像 | env DATE=20190728 python -m mypackage.render
这样的 env 参数时,我可以看到带有 where convert(varchar,created_at,112) = '20190728'
的查询,但是当我使用 env var 时,我总是得到一个带有像 where convert(varchar,created_at,112) = ''
这样的 env 变量的空字符串
【问题讨论】:
请提供您运行的实际命令,以及您“看到”的输出。 @Jens 我已经编辑了这个问题,以获得更多关于我的方法以及为什么我在 shell 中使用 cat 的详细信息,还有更好的选择吗? 【参考方案1】:问题在于make
$(shell ...) 调用。您可能需要命令替换(shell 功能)。并杀死一只没用的猫。
test:
$(MAKE) do_test VAR=test
do_test:
VAR=$(VAR) python -m mypackage.render < file.txt
请注意,不建议在 Makefile 中设置 SHELL
。
【讨论】:
以上是关于如何在 Makefile 规则中将 env 变量传递给 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章