
envocabulary v1.0.4
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.
envocabulary
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, launchctl getenv conhece launchd — nenhum deles diz que ~/.zshrc:42 é o verdadeiro autor.
Funciona com zsh e bash no macOS, Linux e FreeBSD.
O momento "ah"
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
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.
Comandos
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;--checkencontra entradas mortas
Arquivos 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;--htmlgrava um arquivo.htmlcom timestamp no diretório atualclean [--full] FILE— lista linhas a serem removidas; com--full, imprime o conteúdo completo já limpo
Outros:
-V,--version— imprime versão, commit e data de build
Use 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.
Outro exemplo: encontrando referências quebradas
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)
Outro exemplo: rastreando entradas do PATH
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).
Limitações
- Uma atribuição por linha (
export EDITOR=vim VISUAL=vimregistra apenasEDITOR). danglingnão resolve atribuições ou expansões do tipo PATH (export GOPATH=$HOME/go).- A atribuição do
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$PATHem vez de adicionada explicitamente. - Shells sem suporte: fish, nu, csh/tcsh, PowerShell.
Somente leitura por design
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.