复制了 env 文件,脚本却说变量不存在
前几天对着一份自动化脚本的说明配环境。说明写的是:把示例环境文件复制成一份本地的 env 文件,填上图片目录。文件放好了,入口脚本的自检也过了,真正用到目录的时候,脚本还是说变量没有。
打开入口文件才看明白,它根本没去读那个文件。
两套东西,互不相认
终端里的环境变量活在进程自己的内存里。你导出过的,只有这个 shell 以及它拉起来的子进程能看见。
env 文件只是当前目录下的一个文本。bash 不会因为旁边有它就自动载入,Python 读进程环境的时候也不会顺手打开它。读取环境变量的函数查的是进程,不是仓库根目录有没有这个文件。
所以文件在项目里,和变量在这次运行里,是两回事。那份说明后半段其实写了:脚本直接读系统环境变量,可以先打开自动导出,再把 env 文件载入当前 shell。这句话在表格后面,快速开始的命令是从自检开始的,中间没有载入这一步。照着命令抄的人会漏掉。
我对照过的代码
入口脚本在 workflow 目录的 scripts 里,仓库是一个图文发布的示例。文件头只有参数解析、操作系统接口、json 和网络请求库,没有 dotenv 这个库,也没有自己逐行解析 env 文件。
自检子命令看的是依赖包和本机调试端口在不在,不看 env 文件有没有被当前 shell 吃进去。所以自检通过,不代表后面的脚本拿得到图片目录那一项变量。
下次怎么少踩一次
临跑之前在同一个终端里做三件事:先打开自动导出,再载入 env 文件,最后关掉自动导出,然后才运行入口脚本的自检。
打开自动导出的作用,是载入文件时把里面的赋值一并交给子进程。有的 shell 只载入、不导出,子进程里的 Python 还是看不见。
如果要改代码,我更希望入口自己找仓库根的 env 文件,按行写进进程环境,并且已经存在的环境变量不要覆盖。这样命令行里临时导出的仍然优先,文件只当默认值。手机号、密码、Cookie 继续留在本地文件,不要进仓库。这个项目的忽略列表已经在排除凭据文件,方向是对的。
更小的改法:示例环境文件第一行加注释,写清楚复制之后入口脚本不会自动加载,需要自己在 shell 里载入。不改逻辑也能挡住大部分人。
顺手提一句调试端口
同一份说明还要求浏览器带远程调试端口启动。这个端口会把已经登录的浏览器交给本机任意进程。变量没加载是使用问题,调试端口是安全问题,两件都容易在先跑起来的时候被跳过。用测试账号,用完把那个浏览器关掉,比事后去看是谁发的内容省事。
以上是对着主分支的入口脚本和说明对过的,我没有改他们的代码。
- 点赞
- 收藏
- 关注作者
评论(0)