.env 可移植性预检
粘贴 .env 文件内容,检查 Node 的 `dotenv`、Docker/Docker Compose 和直接加载该文件的 POSIX shell 会以不同方式读取或导致失败的值。所有内容完全在浏览器中处理,不会上传、记录或发送;真实 .env 文件通常含有秘密,因此这一点很重要。
在您的浏览器中本地处理。文件绝不会被上传。
使用方法 工具
- 粘贴 .env 内容或有代表性的片段;分析完全在浏览器中进行,真实秘密值不会离开此页面。
- 选择“检查 .env 文件”。
- 查看每个标记行有何歧义或风险,以及 dotenv、Docker Compose 或 POSIX shell 之间的差异。
- 仅在提供时使用建议改写;未闭合引号、重复键、插值引用、无效键名等情况需手动处理,因为错误猜测比不猜更糟。
假设条件
- 预期每行一个 KEY=value,注释行以 `#` 开头,并允许空行;这是 dotenv、Docker Compose 的 env_file 和 POSIX shell 加载时常见的 .env 形式。
- 只有值以匹配的一对单引号或双引号开头和结尾时,才视为“已加引号”;值中其他位置的孤立引号正是未闭合引号检查要发现的情况。
- 绝不假设重复键、插值引用或无效键名原本意图为何;只报告问题,不静默处理。
来源与参考数据
方法说明
将每行解析为键、原始值及是否加引号,再检查 dotenv、Docker/Docker Compose 与 POSIX shell 对 .env 语法有文档记录的差异:未加引号的空格和 `#`(解释不同或截断)、`export` 前缀(各解析器接受、移除或拒绝方式不同)、未闭合引号(跨行行为不一致)、`$VAR`/`${VAR}` 插值(shell/Compose 会展开,dotenv 默认按字面保留,除非同时使用 dotenv-expand)、重复键(最后出现者静默覆盖前者)、未加引号值尾随空白(dotenv 保留,shell 导出时去除),以及不是 POSIX shell 有效标识符的键名。仅在确实安全时建议改写:为值加引号、删除尾随空白或移除 export 前缀;绝不猜测意图。
计算示例
引用另一个变量的值
输入项: API_URL=${BASE_URL}/api
结果: dotenv 默认不会展开 `${BASE_URL}`,因此 API_URL 中会保留字面字符串,除非另行使用 dotenv-expand;但加载该文件的 POSIX shell 和 Docker Compose 会展开。标记为警告,不提供改写,因为无法仅从文件推断是否想要展开。
export 前缀
输入项: export APP_NAME=My Example App
结果: 这是有效 POSIX shell 语法,但 dotenv 与 Docker Compose 对 `export ` 前缀处理不同:有些拒绝,有些会将其并入键名。标记为警告,并安全建议移除前缀,因为 dotenv(常见使用方)期望普通形式。值中未加引号的空格另行标记为更高严重性的问题。
重复键
输入项: TIMEOUT=30 TIMEOUT=60
结果: 包括 dotenv 在内的多数解析器会静默保留最后一次出现的值,丢弃 `TIMEOUT=30`。第二处标为警告,并指出它覆盖的行。
实用指南
- 包含空格或 `#` 的值应加引号,即使 dotenv 单独使用时允许不加引号;这样直接由 shell 加载或由 Docker Compose 读取时行为才一致。
- 除非已确认文件的所有使用方都会以相同方式展开 `$VAR`/`${VAR}`,否则避免在 .env 文件中使用变量引用。这是常见的 .env 可移植性问题。
- 为兼容基于 dotenv 的工具,不要依赖 `export` 前缀;采用 `KEY=value` 普通形式。若还要从 shell 加载,请使用 shell 包装脚本。
常见错误
- 认为应用“能启动”就表示值可移植;未加引号空格、未展开插值或被静默覆盖的重复键都可能成功加载,却得到错误值。
- 将 .env 键名当作任意标签;宽松的 dotenv 可能接受连字符或数字开头的键,但通过真实 shell 加载时会失败。
常见问题
在这里粘贴真实秘密值安全吗?
分析完全在浏览器中运行;粘贴内容不会上传、记录或传输,本页面自身也不添加分析或遥测。不过对任何工具都应谨慎:若不愿粘贴某个值,请使用形状相同(长度和特殊字符相同)的占位符;这里的检查只看语法,不看值的实际含义。
为什么未加引号空格是错误,而尾随空格只是提示?
内部未加引号空格会使 POSIX shell 或严格 Docker Compose 解析器中的赋值失效,是功能问题。普通值后的尾随空白只是可能让 dotenv 多读入一个意外字符,通常不致命,且可安全自动移除。
为什么工具不替我修复重复键或无效键名?
这两种情况都要决定你的本意:两个重复值哪个正确,或键名应该改成什么。猜错后静默修改,比指出问题让你决定更糟。
为什么 `${BASE_URL}` 在 Compose 中展开,却在 Node dotenv 中保留原文?
Docker Compose 会在 Compose 配置中执行插值,而 `dotenv` 默认不会展开变量引用;Node 通常需要额外的 `dotenv-expand` 等包。实际行为取决于涉及的文件和使用方。此预检只指出语法层面的可移植性风险,不会运行 Compose 或 dotenv。
上次审核: 2026-09-25
这是语法形态检查器,不是完整 shell 或 Docker Compose 解析器:识别常见 KEY=value/注释/空行形式和所列差异,不覆盖每个真实 .env 解析器实现的所有边界情况。对于未闭合引号、插值引用或重复键等真正有歧义的情况,也无法知道原意,只报告歧义而不自行处理。
主题和工具偏好设置,以及已保存和最近使用的列表仅存储在此浏览器中。