
모든 셸 환경 변수에 대해 정확한 파일 및 줄 출처를 추적합니다. macOS, Linux, FreeBSD의 zsh 및 bash에서 셸 설정 파일을 감사하여 죽은 항목, 중복, 고아 파일을 찾아냅니다.
현재 셸의 모든 변수에 대해, 그 변수를 설정한 파일과 줄을 찾아냅니다 — 또는 어떤 하위 시스템(direnv, launchd, terminal, SSH, system)이 주입했는지도 알려줍니다. 셸 설정이 여러 파일과 백업으로 흩어져 감을 잃었을 때를 위한 몇 가지 정적 파일 명령도 포함되어 있습니다.
이 도구를 만든 이유는 몇 달마다 같은 시간을 허비하며 JAVA_HOME이나 PATH가 왜 예상치 못한 곳을 가리키는지 추적해야 했기 때문입니다. which는 명령을 알고, direnv status는 direnv를 알고, launchctl getenv는 launchd를 알지만, 그 어느 것도 ~/.zshrc:42가 실제 작성자라는 사실은 알려주지 못합니다.
macOS, Linux, FreeBSD에서 zsh 및 bash와 함께 동작합니다.
grep -r JAVA_HOME ~는 변수를 언급하는 모든 파일을 보여주지만, 현재 셸에서 어떤 할당이 활성화되어 있는지는 출력만으로는 명확하지 않습니다:
$ 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)는 releases page에서 받을 수 있습니다.
라이브 환경(실행 중인 셸 검사):
scan (기본값) — 현재 환경의 모든 변수를 출처별로 그룹화하여 출력explain NAME — 지정된 변수에 대한 전체 귀속 정보 출력path [VARNAME...] — 콜론으로 구분된 경로 변수의 항목별 귀속 정보; --check는 죽은 항목을 찾음정적 파일:
inventory — 모든 셸 설정 파일을 나열하고 유형별 정의 수를 셈catalog — 모든 설정 파일을 병합하여 전체 셸 구성을 출력dedup — 파일 간 export, 할당, 별칭, 함수 중복 보고서dangling — 더 이상 유효한 대상을 참조하지 않는 설정 파일 항목을 나열lost — 고아/백업 설정 파일에만 있는 정의를 나열report — 통합 감사: 삭제 가능, 검토(값이 변경된 중복), dangling, 고아 파일; --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
어떤 셸 시작 할당과도 일치하지 않는 항목은 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 또는 편집하지 않습니다. 비상 상황용 도구가 상황을 더 악화시키는 원인이 되어서는 안 됩니다. 정리를 원한다면 file:line 포인터를 복사해서 직접 편집하세요. clean은 stdout으로 출력하며, 리다이렉트는 직접 수행해야 합니다.