~/.zshrc:42支持 macOS、Linux 和 FreeBSD 上的 zsh 和 bash。
grep -r JAVA_HOME ~ 会显示所有提及该变量的文件,但从输出中看不出哪个赋值在当前 shell 中生效:
$ 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]
一行命令(检测 OS/架构,将二进制文件放到你的 $PATH 中,并在 macOS 上清除 Gatekeeper 限制):
curl -fsSL https://raw.githubusercontent.com/sreckoskocilic/envocabulary/main/install.sh | sh
或者 go install github.com/sreckoskocilic/envocabulary/cmd/envocabulary@latest。预编译二进制文件和 Linux 软件包(.deb / .rpm / .apk / .pkg.tar.zst)位于发布页面。
实时环境(内省当前运行的 shell):
scan (默认) — 打印当前环境中的所有变量,并按来源分组explain NAME — 打印所提供变量的完整归属信息path [VARNAME...] — 对冒号分隔的路径变量逐项归属;--check 查找失效条目静态文件:
inventory — 列出所有 shell 配置文件,并按类型统计定义数量catalog — 通过合并所有配置文件,打印完整的 shell 配置dedup — 跨文件重复项报告(导出、赋值、别名、函数)dangling — 列出不再引用有效目标的配置文件条目lost — 列出仅存在于孤立/备份配置文件中的定义report — 合并审计:可安全删除、需复核(值已更改的重复项)、悬空项、孤立文件;--html 会在当前目录中写入一个带时间戳的 .html 文件clean [--full] FILE — 列出应被剥离的行;使用 --full 时,打印完整的清理后内容其他:
-V, --version — 打印版本、提交和构建日期使用 envocabulary <cmd> -h 查看标志。
下面的示例输出使用 ~/ 以示简洁;该工具除 report 外均打印绝对路径。
dangling 会列出不再引用有效目标的配置文件条目——比如 JAVA_HOME=/opt/jdk-i-uninstalled 和 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 显示 PATH(或 MANPATH、FPATH 等)中每个条目是在哪里引入的:
$ 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
未匹配到任何 shell 启动项赋值的条目会显示为 inherited。
--check 会筛选出目录已不存在的条目,并追溯到需要编辑的配置文件:
$ 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)
发现失效条目时以状态 1 退出(在脚本中很有用)。
export EDITOR=vim VISUAL=vim 只记录 EDITOR)。dangling 不会解析类 PATH 的赋值或展开(export GOPATH=$HOME/go)。path 的归属基于 xtrace 差异——第一个包含某条目的赋值会声明该条目,即使它只是通过 $PATH 展开被携带而来,而非显式添加。envocabulary 绝不会 unset、rm 或编辑你的 shell 配置。应急工具不应该成为让情况变得更糟的东西。如果你想清理,请复制 file:line 指针并自行编辑。clean 输出到 stdout;重定向由你自己完成。