environment-variables - 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"
解决方案
您可能认为通过添加引号来拯救自己。而且,如果这个变量是由 shell 解析的,那么你就是。
但是,make 不使用引号。变量的值是等号右侧的完整内容(在跳过任何初始空白之后)。例如:
POSTGRES_USER="postgres"
如果由 shell 解析,POSTGRES_USER
变量的值是postgres
因为 shell 解释了引号。但是 make 不解释引号,因此上面的行导致POSTGRES_USER
make 变量具有值"postgres"
(包括引号)。
现在解决你的问题。您的文件的第 6 行是:
SECRET_KEY="<MY_SECRET_KEY>"
而且您没有向我们展示您的密钥文本。
首先,即使在 shell 语法中也是错误的:您必须在这里使用单引号而不是双引号,如果您的密钥本身包含单引号,那么即使这样也不正确;你必须逃避它。
但是,该错误意味着在您的密钥中,您有字符序列$(
或${
make 解释为启动变量引用:因为没有关闭括号或大括号,您会收到此错误。
简短的回答是,如果变量赋值的值包含任何类型的特殊字符(包括空格),则没有可移植的方式来使用由 make 和 shell 提供的同一文件。
通常人们会做一些类似base64的事情来编码他们的密钥,这样那些特殊字符就不是问题了。
推荐阅读
- javascript - CSS/JS:使用已知宽度和高度的图像元素模拟背景图像封面
- javascript - 云函数 - 创建新文档时不会触发 onWrite
- jenkins - Jenkins 共享库中的“vars”如何工作?
- c# - C# 硒 | 按钮没有 id
- reactjs - 使用 Clarifai 的 FACE_DETECT_MODEL 时的状态码 400
- c# - 读取键盘输入而不总是让我的控制台应用程序专注?
- javascript - 那么为什么总是用 undefined 调用呢?
- r - 如何从图中提取每条线点坐标到不同变量?
- mysql - 如何在 PHP 中从多到多关系表中删除
- node.js - `mongoose.model()` 的第二个参数应该是一个模式,但它是一个模式