【问题标题】:Setting environment variables from make recipe not working as exected从 make recipe 设置环境变量未按预期工作
【发布时间】:2021-09-30 14:22:47
【问题描述】:

当尝试使用 make 文件运行 go 程序时,以下内容不起作用。 我尝试通过设置(导出)1条语句来显式设置env变量,另一条语句在我读取env变量的地方运行我的go代码。这不起作用。


test:
        export Sample="Help"
        go run main.go

与上面相同,在 make 文件中实现如下,我的 go 代码能够读取 env 变量。


test:
        Sample="Help" go run main.go

任何帮助将不胜感激。

【问题讨论】:

  • 这能回答你的问题吗? Makefile variable initialization and export
  • @JimB 我认为问题在于 OP 不知道配方的行是在不同的 shell 中执行的,而不是 make 变量和环境变量之间的关系。如果我是对的,它不是您找到的问题的重复项(但它可能是另一个问题的重复项)。
  • 配方的行在不同的 shell 中执行。所以你的export 命令根本没有效果。通过在第一行末尾添加&& \ 来连接这两行:export Sample="Help" && \ 。 Make 会将其视为单行配方并将其传递给单个 shell。注意:反斜杠必须是该行的最后一个字符。没有尾随空格(我必须在反斜杠之后放置空格,但这只是为了 Markdown 正确渲染)。

标签: makefile


【解决方案1】:

正如在其他 cmets 中所述,每一行都在单独的 shell 中运行,因此要从一个 shell 中获取变量的结果,您需要将它们“链接”起来,如 cmets 中所示。

另一种我觉得很巧妙的方法(并且避免了链接 shell 命令)是:

.PHONY: all
all: export TEST=123
all:
    @echo "TEST (make) = $(TEST)"
    @echo "TEST (shell) = $$TEST"
    @./script.sh


$(info TEST: $(TEST) - not set outside the recipe)

测试脚本包含echo "TEST (in shell script) = $TEST"

输出是:

TEST:  - not set outside the recipe
TEST (make) = 123
TEST (shell) = 123
TEST (in shell script) = 123

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 2019-05-18
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2013-10-12
    • 2018-09-12
    相关资源
    最近更新 更多