如何在 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在environment.prod.ts中将模式保存为ENV变量?

使用 ENV 变量或默认值定义 Makefile 变量

Makefile将变量传递给bash脚本

在shell脚本中将变量的值作为命令行参数传给程序

6.Makefile自动化变量

6.Makefile自动化变量