अपडेट पर वापस जाएँ
New releaseSep 16, 2026

envocabulary v1.0.5

प्रत्येक शेल पर्यावरण चर को उसकी सटीक फ़ाइल और पंक्ति उत्पत्ति तक ट्रेस करें। macOS, Linux और FreeBSD पर zsh और bash में डेड एंट्रीज़, डुप्लिकेट्स और ऑर्फ़न फ़ाइलों के लिए शेल कॉन्फ़िग्स का ऑडिट करें।

साझा करें

envocabulary

CI codecov Release

आपके वर्तमान shell में मौजूद हर variable के लिए, वह फ़ाइल और पंक्ति खोजें जिसने उसे सेट किया, या यह पता लगाएं कि किस subsystem (direnv, launchd, terminal, SSH, system) ने उसे inject किया। साथ ही कुछ static-file commands उस पल के लिए जब आपकी shell config N फ़ाइलों और backups में बिखर चुकी हो और आपका भटकाव हो गया हो।

मैंने यह इसलिए बनाया क्योंकि हर कुछ महीनों में मैं वही एक घंटा खो देता था यह पता लगाने में कि कोई JAVA_HOME या PATH किसी अप्रत्याशित जगह की ओर इशारा क्यों कर रहा है। which commands जानता है, direnv status direnv जानता है, launchctl getenv launchd जानता है। इनमें से कोई भी आपको यह नहीं बताता कि असली लेखक ~/.zshrc:42 है।

macOS, Linux और FreeBSD पर zsh और bash के साथ काम करता है। नीचे दिया गया नमूना output संक्षिप्तता के लिए ~/ का उपयोग करता है; tool report को छोड़कर हर जगह absolute paths प्रिंट करता है।

वह "अहा" वाला पल

grep -r JAVA_HOME ~ हर उस फ़ाइल को दिखाता है जो variable का ज़िक्र करती है। यह नहीं बताता कि जिस shell में आप बैठे हैं उसमें कौन सा assignment जीता:

$ 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]

eval "$(brew shellenv)", eval "$(pyenv init -)" और इनके जैसे तरीकों से सेट किए गए variables eval पंक्ति की ओर इशारा करते हैं। जनरेट किए गए code की अपनी कोई पंक्ति नहीं होती; eval ही वह चीज़ है जिसे आप editor में खोल सकते हैं।

इंस्टॉल

curl -fsSL https://raw.githubusercontent.com/sreckoskocilic/envocabulary/main/install.sh | sh

यह script OS और arch का पता लगाता है, release archive डाउनलोड करता है, उसका sha256 checksum सत्यापित करता है, और जब cosign इंस्टॉल हो तो cosign signature भी सत्यापित करता है। यह /usr/local/bin में इंस्टॉल करता है यदि वह writable हो, अन्यथा ~/.local/bin में, और चेतावनी देता है यदि वह directory आपके $PATH पर न हो। macOS पर यह Gatekeeper quarantine flag भी हटा देता है।

Options: किसी version को pin करने के लिए sh -s -- --version v1.0.4, destination चुनने के लिए --bin-dir DIR

या go install github.com/sreckoskocilic/envocabulary/cmd/envocabulary@latest। ध्यान दें कि go install से बना build --version के लिए dev रिपोर्ट करता है; केवल release binaries ही version, commit और build date लेकर चलते हैं।

Pre-built binaries और Linux packages (.deb / .rpm / .apk / .pkg.tar.zst) releases page पर हैं।

Commands

Live env (आपके चल रहे shell को पढ़ता है):

  • scan (default) — वर्तमान env में सभी variables को origin के अनुसार समूहित करके प्रिंट करता है
  • explain NAME — एक variable के लिए पूरी attribution
  • path [VARNAME...] — colon-separated path variables के लिए प्रति-entry attribution; --check मृत entries खोजता है

Static files:

  • inventory$HOME में मौजूद shell config फ़ाइलों की सूची बनाता है (canonical वाली और .zshrc.bak जैसी backup variants) और type के अनुसार definitions की गिनती करता है
  • catalog — उन फ़ाइलों को उसी क्रम में concatenate करके प्रिंट करता है जिस क्रम में shell उन्हें पढ़ता है
  • dedup — exports, assigns, aliases, functions के लिए duplicate report, फ़ाइल के भीतर और फ़ाइलों के बीच
  • dangling — उन config entries की सूची बनाता है जिनका target अब मौजूद नहीं है; कोई मिलने पर 1 के साथ exit करता है
  • lost — उन definitions की सूची बनाता है जो केवल orphan/backup फ़ाइलों में मौजूद हैं
  • report — संयुक्त audit: safe-to-delete, review (जिन dups का मान भिन्न हो, साथ ही सभी duplicate functions), dangling, orphaned files; --html वर्तमान directory में timestamped .html फ़ाइल लिखता है
  • clean [--full] FILE — उन comment lines की सूची बनाता है जो हटाई जाएंगी; --full के साथ, cleaned content प्रिंट करता है

अन्य:

  • -V, --version — version, commit और build date प्रिंट करता है

flags के लिए envocabulary <cmd> -h

Exit codes: सफलता पर 0, runtime error पर या जब dangling / path --check कुछ खोज लें तो 1, usage error पर 2।

टूटे references खोजना

dangling उन config entries की सूची बनाता है जो अब किसी चीज़ की ओर इशारा नहीं करतीं, जैसे 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 entries को trace करना

path दिखाता है कि PATH (या MANPATH, FPATH, आदि) में प्रत्येक entry कहाँ से आई:

$ envocabulary path PATH
## PATH
  /opt/homebrew/bin       ~/.zprofile:6
  /opt/homebrew/sbin      ~/.zprofile:6
  /usr/local/bin          /etc/zprofile:11
  /usr/bin                inherited
  /bin                    inherited
  ~/.cargo/bin            ~/.zshrc:22

जो entries किसी भी shell startup assignment से मेल नहीं खातीं वे inherited के रूप में दिखती हैं। इसमें हमेशा /usr/bin, /bin, /usr/sbin और /sbin शामिल होती हैं: ये वह seed हैं जहाँ से tracer शुरू होता है, किसी फ़ाइल द्वारा जोड़ी गई चीज़ नहीं।

--check उन entries तक filter करता है जिनकी directory अब मौजूद नहीं है और आपके dotfiles तथा /etc/paths.d के विरुद्ध source को फिर से resolve करता है, ताकि यह उस पंक्ति की ओर इशारा करे जिसे edit करना है:

$ 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)

मृत entries मिलने पर 1 के साथ exit करता है, जिससे यह scripts में उपयोगी हो जाता है।

सीमाएँ

  • प्रति पंक्ति एक assignment: export EDITOR=vim VISUAL=vim केवल EDITOR रिकॉर्ड करता है।
  • Static commands केवल $HOME में मौजूद canonical dotfiles (.zshenv, .zprofile, .zshrc, .zlogin, .zlogout, .bashrc, .bash_profile, .profile) और उनकी .bak/.old-शैली की variants को देखते हैं। ये $ZDOTDIR, ~/.config/zsh, /etc, या आपके द्वारा source की गई फ़ाइलों का अनुसरण नहीं करते।
  • dangling PATH-जैसी values और उनमें मौजूद किसी भी expansion वाली चीज़ (export GOPATH=$HOME/go) को छोड़ देता है; यह उन्हें statically resolve नहीं कर सकता।
  • path attribution xtrace diffs पर आधारित है। किसी entry को शामिल करने वाला पहला assignment उस पर दावा करता है, भले ही वह स्पष्ट रूप से जोड़े जाने के बजाय $PATH expansion के माध्यम से आगे ले जाया गया हो।
  • bash के अंतर्गत, eval के माध्यम से चलाया गया code eval पंक्ति के साथ एक offset रिपोर्ट करता है; bash में eval bodies के लिए zsh जैसा marker नहीं होता।
  • असमर्थित shells: fish, nu, csh/tcsh, PowerShell।

डिज़ाइन से read-only

envocabulary कभी भी आपकी shell config को unset, rm, या edit नहीं करेगा। एक emergency tool को वह चीज़ नहीं होना चाहिए जो emergency को और बदतर बना दे। यदि आप सफ़ाई करना चाहते हैं, तो file:line pointers copy करें और edits स्वयं करें। clean stdout पर output देता है; redirect आप करें।

श्रेणियाँ