首页 > 解决方案 > GNU make .env:6: *** 未终止的变量引用。停止

问题描述

我有 Windows 10 并安装了 GNU Make 4.3 Built for Windows32。这是我第一次使用 GNU make,它给了我这样的错误

.env:6: *** unterminated variable reference. Stop.

我的 .env 文件包含

POSTGRES_USER="postgres"
POSTGRES_PASS="<MY_DB_PASS>"
POSTGRES_DB="<MY_DB>"
PG_HOST="localhost"
PG_PORT="5432"
SECRET_KEY="<MY_SECRET_KEY>"
DEBUG=True
ALLOWED_HOSTS="localhost 127.0.0.1"

标签: environment-variablesgnu-makegnu

解决方案


您可能认为通过添加引号来拯救自己。而且,如果这个变量是由 shell 解析的,那么你就是。

但是,make 不使用引号。变量的值是等号右侧的完整内容(在跳过任何初始空白之后)。例如:

POSTGRES_USER="postgres"

如果由 shell 解析,POSTGRES_USER变量的值是postgres因为 shell 解释了引号。但是 make 不解释引号,因此上面的行导致POSTGRES_USERmake 变量具有值"postgres"(包括引号)。

现在解决你的问题。您的文件的第 6 行是:

SECRET_KEY="<MY_SECRET_KEY>"

而且您没有向我们展示您的密钥文本。

首先,即使在 shell 语法中也是错误的:您必须在这里使用单引号而不是双引号,如果您的密钥本身包含单引号,那么即使这样也不正确;你必须逃避它。

但是,该错误意味着在您的密钥中,您有字符序列$(${make 解释为启动变量引用:因为没有关闭括号或大括号,您会收到此错误。

简短的回答是,如果变量赋值的值包含任何类型的特殊字符(包括空格),则没有可移植的方式来使用由 make 和 shell 提供的同一文件。

通常人们会做一些类似base64的事情来编码他们的密钥,这样那些特殊字符就不是问题了。


推荐阅读