direnv
Sobre
direnv é uma extensão de shell que carrega e descarrega variáveis de ambiente automaticamente conforme o diretório atual, evitando o acúmulo de configurações no ~/.profile. É compilado como um executável estático único, o que o torna rápido o suficiente para ser imperceptível a cada prompt, e é agnóstico de linguagem. Licença MIT, mantido por @zimbatm e contribuidores.
- Site oficial: direnv.net
- Repositório: github.com/direnv/direnv
Funcionamento
Antes de cada prompt, o direnv verifica a existência de um arquivo .envrc (e, opcionalmente, .env) no diretório atual e nos diretórios pais. Se o arquivo existir e estiver autorizado (via direnv allow), ele é carregado em um sub-shell bash e todas as variáveis exportadas são capturadas e disponibilizadas no shell atual. Ao sair do diretório, as variáveis são descarregadas automaticamente.
Suporta hooks para os shells mais comuns: bash, zsh, tcsh, fish, elvish, powershell, murex e nushell.
$ mkdir ~/my-project && cd ~/my-project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
Principais Recursos
- Stdlib: conjunto de funções utilitárias disponíveis dentro do
.envrc(ex.:PATH_add binem vez deexport PATH=$PWD/bin:$PATH), documentado na manpagedirenv-stdlib(1). - Extensões próprias: é possível sobrescrever/estender a stdlib criando
~/.config/direnv/direnvrcou arquivos em~/.config/direnv/lib/*.sh, carregados antes do.envrc. - Suporte a
.env: pode ler arquivos.envalém do.envrc(a stdlib não fica disponível dentro do.env; usa-sedotenvno.envrcpara combiná-los). - Mecanismo de segurança:
.envrcnovos ou alterados precisam ser explicitamente autorizados comdirenv allow.
Casos de Uso
- Carregar variáveis de ambiente de 12factor apps.
- Criar ambientes de desenvolvimento isolados por projeto.
- Carregar segredos apenas no contexto de deploy.
- Construir soluções similares a
rbenv,pyenvephpenv, já que é agnóstico de linguagem.
Público-alvo
Desenvolvedores que trabalham com múltiplos projetos e querem variáveis de ambiente e configurações específicas por diretório, sem poluir o shell global.
Instalação Básica
- Instalar via gerenciador de pacotes da distribuição (a maioria já empacota o
direnv). - Adicionar o hook do direnv ao shell.
- Reiniciar o shell.
FAQ
- O
.envrcé carregado no shell atual? Não. Odirenvcria um sub-processo bash para carregar stdlib,direnvrce.envrc, e exporta apenas o diff de variáveis de ambiente para o shell original. Por isso, aliases e funções definidos no.envrcnão são exportáveis. - Dá para sobrescrever a stdlib padrão? Sim, via
~/.config/direnv/direnvrc.
Limitações
- Aliases e funções shell definidos dentro do
.envrcnão são propagados para o shell original (apenas variáveis de ambiente). - A funcionalidade da stdlib não está disponível em arquivos
.env.
Projetos Relacionados
- mise — direnv, make e asdf combinados em uma única ferramenta.
- asdf — gerenciador de versões com plugin asdf-direnv para integração.
- starship — prompt cross-shell complementar.