
direnv
CLI按目录自动加载和卸载环境变量:进入项目时读取 .envrc(可选 .env),离开时还原,避免多个项目的配置与密钥互相串用。需先把 hook 接入 bash、zsh、fish 等 shell。
direnv -- unclutter your .profile
direnv is an extension for your shell. It augments existing shells with a
new feature that can load and unload environment variables depending on the
current directory.
Use cases
- Load 12factor apps environment variables
- Create per-project isolated development environments
- Load secrets for deployment
How it works
Before each prompt, direnv checks for the existence of a .envrc file (and
optionally a .env file) in the current
and parent directories. If the file exists (and is authorized), it is loaded
into a bash sub-shell and all exported variables are then captured by
direnv and then made available to the current shell.
It supports hooks for all the common shells like bash, zsh, tcsh and fish.
This allows project-specific environment variables without cluttering the
~/.profile file.
Because direnv is compiled into a single static executable, it is fast enough to be unnoticeable on each prompt. It is also language-agnostic and can be used to build solutions similar to rbenv, pyenv and phpenv.
Getting Started
Prerequisites
- Unix-like operating system (macOS, Linux, ...)
- A supported shell (bash, zsh, tcsh, fish, elvish, powershell, murex, nushell)
Basic Installation
- direnv is packaged in most distributions already. See the installation documentation for details.
- hook direnv into your shell.
Now restart your shell.
Quick demo
To follow along in your shell once direnv is installed.
# Create a new folder for demo purposes.
$ mkdir ~/my-project
$ cd ~/my-project
# Show that the FOO environment variable is not loaded.
$ echo ${FOO-nope}
nope
# Create a new .envrc. This file is bash code that is going to be loaded by
# direnv.
$ echo export FOO=foo > .envrc
.envrc is not allowed
# The security mechanism didn't allow to load the .envrc. Since we trust it,
# let's allow its execution.
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
# Show that the FOO environment variable is loaded.
$ echo ${FOO-nope}
foo
# Exit the project
$ cd ..
direnv: unloading
# And now FOO is unset again
$ echo ${FOO-nope}
nope
Some stdlib functions store files in .direnv/. Add .direnv/ to your
.gitignore. For local overrides that you do not commit, put
source_env_if_exists .envrc.local in .envrc and also ignore .envrc.local.
The stdlib
Exporting variables by hand is a bit repetitive so direnv provides a set of
utility functions that are made available in the context of the .envrc file.
As an example, the PATH_add function is used to expand and prepend a path to
the $PATH environment variable. Instead of export PATH=$PWD/bin:$PATH you
can write PATH_add bin. It's shorter and avoids a common mistake where
$PATH=bin.
To find the documentation for all available functions check the direnv-stdlib(1) man page.
It's also possible to create your own extensions by creating a bash file at
~/.config/direnv/direnvrc or ~/.config/direnv/lib/*.sh. This file is
loaded before your .envrc and thus allows you to make your own extensions to
direnv.
Note that this functionality is not supported in .env files. If the
coexistence of both is needed, one can use .envrc for leveraging stdlib and
append dotenv at the end of it to instruct direnv to also read the .env
file next.
Docs
- Install direnv
- Hook into your shell
- Develop for direnv
- Manage your rubies with direnv and ruby-install
- Using direnv with GitHub Actions
- Community Wiki
Make sure to take a look at the wiki! It contains all sorts of useful information such as common recipes, editor integration, tips-and-tricks.
Man pages
FAQ
Based on GitHub issues interactions, here are the top things that have been confusing for users:
-
direnv has a standard library of functions, a collection of utilities that I found useful to have and accumulated over the years. You can find it here: https://github.com/direnv/direnv/blob/master/stdlib.sh
-
It's possible to override the stdlib with your own set of function by adding a bash file to
~/.config/direnv/direnvrc. This file is loaded and its content made available to any.envrcfile. -
direnv is not loading the
.envrcinto the current shell. It's creating a new bash sub-process to load the stdlib, direnvrc and.envrc, and only exports the environment diff back to the original shell. This allows direnv to record the environment changes accurately and also work with all sorts of shells. It also means that aliases and functions are not exportable right now.
Translations
The direnv documentation is also available in other languages:
Contributing
Bug reports, contributions and forks are welcome. All bugs or other forms of discussion happen on http://github.com/direnv/direnv/issues .
Or drop by on Matrix to have a chat. If you ask a question make sure to stay around as not everyone is active all day.
Testing
To run our tests, use these commands: (you may need to install homebrew)
brew bundle
make test
Complementary projects
Here is a list of projects you might want to look into if you are using direnv.
- starship - A cross-shell prompt.
- Projects for Nix integration - choose from one of a variety of projects offering improvements over Direnv's built-in
use_niximplementation.
Related projects
Here is a list of other projects found in the same design space. Feel free to submit new ones.
- Environment Modules - one of the oldest (in a good way) environment-loading systems
- autoenv - older, popular, and lightweight.
- zsh-autoenv - a feature-rich mixture of autoenv and smartcd: enter/leave events, nesting, stashing (Zsh-only).
- asdf - a pure bash solution that has a plugin system. The asdf-direnv plugin allows using asdf managed tools with direnv.
- ondir - OnDir is a small program to automate tasks specific to certain directories
- shadowenv - uses an s-expression format to define environment changes that should be executed
- quickenv - an alternative loader for
.envrcfiles that does not hook into your shell and favors speed over convenience. - mise - direnv, make and asdf all in one tool.
Commercial support
Looking for help or customization?
Get in touch with Numtide to get a quote. We make it easy for companies to work with Open Source projects: https://numtide.com/contact
COPYRIGHT
MIT licence - Copyright (C) 2019 @zimbatm and contributors
相关资源

ShellCheck
CLIShell 脚本静态分析工具:指出 bash/sh 脚本里的语法错误、引号与变量展开等常见陷阱并给出修改建议,适合校验 agent 生成的脚本,可接入 CI。
koalaman/shellcheck40.2k
CC Safety Net
Plugin在工具调用执行前,拦截破坏性的 Git 与文件命令(如 git reset --hard、rm -rf)以及对 SSH 密钥、.env 等敏感文件的读写。它按命令语义解析,套一层 bash -c 也能识别。支持 Claude Code、Codex 等多种编码 CLI,需要 Node.js 18+。
kenryu42/cc-safety-net1.6k
Nushell
CLI以结构化数据为核心的跨平台 shell:管道里传的是表格而不是纯文本,可以直接打开并查询 JSON、CSV、TOML 等文件;默认构建自带 nu --mcp 模式,可作为 MCP 服务给 agent 调用。
nushell/nushell40.7k
Claude Code
CLIAnthropic 官方终端编码 Agent:读懂代码库、修改代码、执行命令、处理 git 流程,支持插件、MCP 与无头模式(claude -p)。需要登录 Claude 账号或配置 API Key。
anthropics/claude-code151k
Codex CLI
CLIOpenAI 官方在本地运行的编码 Agent,Rust 实现,可读写代码、执行命令并在系统沙箱中运行;可用 ChatGPT 订阅登录,也可配置 API Key。
openai/codex130k
Gemini CLI
CLIGoogle 官方开源终端 Agent,使用 Gemini 模型与 100 万 token 上下文,内置 Google 搜索、文件与 Shell 工具并支持 MCP;个人 Google 账号有免费额度。
google-gemini/gemini-cli107k