direnv可自动管理项目环境变量:进目录加载、出目录清理,需配置shell hook并授权.direnvrc;支持读取.env、联动pyenv、激活venv,确保变量隔离与安全。

直接用 direnv 就行,它专为这个场景设计:进目录自动加载,出目录自动清理,不残留、不冲突、还安全。
安装与 shell 集成是前提
没配好 hook,direnv 就只是个摆设。必须在 shell 配置文件里加一句启动指令:
- zsh 用户,在 ~/.zshrc 末尾加:
eval "$(direnv hook zsh)" - bash 用户,在 ~/.bashrc 末尾加:
eval "$(direnv hook bash)" - 改完记得
source ~/.zshrc或重启终端,让 hook 生效
每个项目建一个 .envrc 文件
在项目根目录下新建 .envrc,内容就是普通 shell 语法:
export API_KEY="xxx"export DATABASE_URL="postgresql://dev:pwd@localhost:5432/mydb"export PATH="/path/to/project/bin:$PATH"- 还能定义别名:
alias deploy="./scripts/deploy.sh"
首次进入目录时,direnv 会拦截并提示 direnv: error .envrc is blocked,这时手动运行 direnv allow 授权一次,之后就全自动了。
支持标准库,兼容老项目
如果项目已有 .env 文件(比如 Python 项目常用),不用重写 .envrc,直接在 .envrc 里写一行:
-
dotenv—— direnv 会自动读取同目录下的 .env -
use python 3.11—— 如果配合 pyenv,还能联动切换 Python 版本 -
layout python—— 自动激活当前目录的 venv(需提前创建)
改 .env 文件后无需再 direnv allow,更省心。
退出即还原,避免变量污染
cd 到其他目录或回到家目录时,direnv 会自动撤回所有在上一个 .envrc 中设置的环境变量、别名和函数。
- PATH 不会越叠越长,旧 bin 路径自动移除
- API_KEY、DEBUG 等敏感变量不会泄露到无关项目中
- 两个项目用了同一个变量名(比如 NODE_ENV),也不会互相覆盖
这种自动隔离,比手动 source 脚本或写一堆 unset 更可靠,也比单纯靠 shell 配置文件管理更精准。











