
Rastreie cada variável de ambiente do shell até a origem exata em arquivo e linha. Audite as configurações do shell em busca de entradas mortas, duplicatas e arquivos órfãos em zsh e bash no macOS, Linux e FreeBSD.
Para cada variável no seu shell atual, encontre o arquivo e a linha que a definiu — ou qual subsistema (direnv, launchd, terminal, SSH, system) a injetou. Além de alguns comandos de arquivos estáticos para quando a configuração do seu shell se espalhou por N arquivos e backups e você perdeu o fio da meada.
Eu construí isto porque eu perdia a mesma hora a cada poucos meses rastreando por que algum JAVA_HOME ou PATH estava apontando para algum lugar que eu não esperava. which conhece comandos, direnv status conhece direnv, conhece launchd — nenhum deles diz que é o verdadeiro autor.
launchctl getenv~/.zshrc:42Funciona com zsh e bash no macOS, Linux e FreeBSD.
Um grep -r JAVA_HOME ~ mostrará todos os arquivos que mencionam a variável, mas não fica claro pela saída qual atribuição está ativa no shell atual:
$ envocabulary explain --chain JAVA_HOME
JAVA_HOME
origin shell-file
primary ~/helpers.sh:3
chain ~/.zshrc → ~/helpers.sh
writers
~/.zshenv:8
~/helpers.sh:3 (winner)
value [hidden, use --values]
Instalação em uma linha (detecta SO/arquitetura, coloca o binário no seu $PATH, limpa o Gatekeeper no macOS):
curl -fsSL https://raw.githubusercontent.com/sreckoskocilic/envocabulary/main/install.sh | sh
Ou go install github.com/sreckoskocilic/envocabulary/cmd/envocabulary@latest. Binários pré-compilados e pacotes Linux (.deb / .rpm / .apk / .pkg.tar.zst) estão na página de releases.
Env ao vivo (inspeciona o seu shell em execução):
scan (padrão) — imprime todas as variáveis no ambiente atual agrupadas por origemexplain NAME — imprime a atribuição completa para a variável fornecidapath [VARNAME...] — atribuição por entrada para variáveis de caminho separadas por dois-pontos; --check encontra entradas mortasArquivos estáticos:
inventory — lista todos os arquivos de configuração do shell e conta definições por tipocatalog — imprime toda a configuração do shell mesclando todos os seus arquivos de configuraçãodedup — relatório de duplicatas entre arquivos para exports, atribuições, aliases e funçõesdangling — lista entradas de arquivos de configuração que não referenciam mais um alvo válidolost — lista definições exclusivas de arquivos de configuração órfãos/backupreport — auditoria combinada: seguro para excluir, revisar (duplicatas com valor alterado), dangling, arquivos órfãos; --html grava um arquivo .html com timestamp no diretório atualclean [--full] FILE — lista linhas a serem removidas; com --full, imprime o conteúdo completo já limpoOutros:
-V, --version — imprime versão, commit e data de buildUse envocabulary <cmd> -h para ver as flags.
A saída de exemplo abaixo usa ~/ por brevidade; a ferramenta imprime caminhos absolutos em todos os lugares exceto report.
dangling lista entradas de arquivos de configuração que não referenciam mais um alvo válido — o tipo de resíduos como JAVA_HOME=/opt/jdk-i-uninstalled e source ~/dotfiles/work-old.zsh:
$ envocabulary dangling
## ~/.zshrc
~/.zshrc:14 source → ~/dotfiles/work-old.zsh (source target missing)
~/.zshrc:42 export JAVA_HOME → /opt/jdk-11 (path does not exist)
path mostra onde cada entrada em PATH (ou MANPATH, FPATH, etc.) foi introduzida:
$ envocabulary path PATH
## PATH
/opt/homebrew/bin ~/.zprofile:21
/usr/local/bin ~/.zprofile:1
/usr/bin /etc/zprofile:1
/bin /etc/zprofile:1
/usr/sbin /etc/zprofile:1
/sbin /etc/zprofile:1
~/.cargo/bin ~/.zshrc:22
Entradas que não correspondem a nenhuma atribuição de inicialização do shell são exibidas como inherited.
--check filtra as entradas cujo diretório não existe mais e as rastreia de volta ao arquivo de configuração a ser editado:
$ envocabulary path --check PATH
## PATH
/opt/homebrew/Cellar/go/1.25.1/libexec/bin ~/.zshrc:17 (does not exist)
/opt/pkg/env/active/bin /etc/paths.d/10-pmk-global:1 (does not exist)
/Applications/VMware /etc/paths.d/com.vmware.fusion.public:1 (does not exist)
Encerra com o código 1 quando entradas mortas são encontradas (útil em scripts).
export EDITOR=vim VISUAL=vim registra apenas EDITOR).dangling não resolve atribuições ou expansões do tipo PATH (export GOPATH=$HOME/go).path é baseada em diffs de xtrace — a primeira atribuição que inclui uma entrada fica com ela, mesmo que ela tenha sido propagada via expansão de $PATH em vez de adicionada explicitamente.envocabulary nunca executará unset, rm nem editará a configuração do seu shell. Uma ferramenta de emergência não deveria ser a coisa que piora a emergência. Se você quiser limpar as coisas, copie os ponteiros file:line e faça as edições você mesmo. clean envia a saída para o stdout; você faz o redirecionamento.