复制了 env 文件,脚本却说变量不存在

举报
yd_299926989 发表于 2026/10/22 09:25:37 2026/10/22
【摘要】 前几天对着一份自动化脚本的说明配环境。说明写的是:把示例环境文件复制成一份本地的 env 文件,填上图片目录。文件放好了,入口脚本的自检也过了,真正用到目录的时候,脚本还是说变量没有。打开入口文件才看明白,它根本没去读那个文件。两套东西,互不相认终端里的环境变量活在进程自己的内存里。你导出过的,只有这个 shell 以及它拉起来的子进程能看见。env 文件只是当前目录下的一个文本。bash ...

前几天对着一份自动化脚本的说明配环境。说明写的是:把示例环境文件复制成一份本地的 env 文件,填上图片目录。文件放好了,入口脚本的自检也过了,真正用到目录的时候,脚本还是说变量没有。

打开入口文件才看明白,它根本没去读那个文件。

两套东西,互不相认

终端里的环境变量活在进程自己的内存里。你导出过的,只有这个 shell 以及它拉起来的子进程能看见。

env 文件只是当前目录下的一个文本。bash 不会因为旁边有它就自动载入,Python 读进程环境的时候也不会顺手打开它。读取环境变量的函数查的是进程,不是仓库根目录有没有这个文件。

所以文件在项目里,和变量在这次运行里,是两回事。那份说明后半段其实写了:脚本直接读系统环境变量,可以先打开自动导出,再把 env 文件载入当前 shell。这句话在表格后面,快速开始的命令是从自检开始的,中间没有载入这一步。照着命令抄的人会漏掉。

我对照过的代码

入口脚本在 workflow 目录的 scripts 里,仓库是一个图文发布的示例。文件头只有参数解析、操作系统接口、json 和网络请求库,没有 dotenv 这个库,也没有自己逐行解析 env 文件。

自检子命令看的是依赖包和本机调试端口在不在,不看 env 文件有没有被当前 shell 吃进去。所以自检通过,不代表后面的脚本拿得到图片目录那一项变量。

下次怎么少踩一次

临跑之前在同一个终端里做三件事:先打开自动导出,再载入 env 文件,最后关掉自动导出,然后才运行入口脚本的自检。

打开自动导出的作用,是载入文件时把里面的赋值一并交给子进程。有的 shell 只载入、不导出,子进程里的 Python 还是看不见。

如果要改代码,我更希望入口自己找仓库根的 env 文件,按行写进进程环境,并且已经存在的环境变量不要覆盖。这样命令行里临时导出的仍然优先,文件只当默认值。手机号、密码、Cookie 继续留在本地文件,不要进仓库。这个项目的忽略列表已经在排除凭据文件,方向是对的。

更小的改法:示例环境文件第一行加注释,写清楚复制之后入口脚本不会自动加载,需要自己在 shell 里载入。不改逻辑也能挡住大部分人。

顺手提一句调试端口

同一份说明还要求浏览器带远程调试端口启动。这个端口会把已经登录的浏览器交给本机任意进程。变量没加载是使用问题,调试端口是安全问题,两件都容易在先跑起来的时候被跳过。用测试账号,用完把那个浏览器关掉,比事后去看是谁发的内容省事。

以上是对着主分支的入口脚本和说明对过的,我没有改他们的代码。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。