आपके पास संभवतः एक लंबा पैट सेट है और, एक निष्पादन योग्य खोजने के लिए, शेल को पथ की खोज करने की आवश्यकता है। उस समय लेने वाली प्रक्रिया से बचने के लिए हर बार जब आप एक कार्यक्रम चलाना चाहते हैं, तो शेल उन कार्यक्रमों की एक सूची रख सकता है जो इसे पहले ही मिल चुका है। उस सूची को "हैश" कहा जाता है। जब शेल कहता है कि whichहैशेड है, तो इसका मतलब है कि वह पहले ही पाथ खोज कर चुका है और whichहैश में अपने स्थान को खोजा और सहेजा है।
man bash इसे इस प्रकार समझाता है:
बैश निष्पादन योग्य फ़ाइलों के पूर्ण पथनामों को याद रखने के लिए हैश टेबल का उपयोग करता है (नीचे शेल बिल्डिंग्स के नीचे हैश देखें)। PATH में निर्देशिकाओं की पूरी खोज केवल तभी की जाती है जब कमांड हैश तालिका में नहीं मिलती है।
जबकि हैश आम तौर पर शेल ऑपरेशंस को गति देता है, एक ऐसा मामला है जहां यह समस्याएं पैदा करता है। यदि आप अपने सिस्टम को अपडेट करते हैं और परिणामस्वरूप, कुछ निष्पादन योग्य स्थान एक नए स्थान पर चले जाते हैं, तो शेल भ्रमित हो सकता है। समाधान को चलाने के लिए है hash -rजो शेल को सभी हैशेड स्थानों को भूल जाता है और पीएटीएच को खरोंच से खोजता है।
हैश से कुछ निष्पादक क्यों गायब हैं?
जब तक आप कम से कम एक बार निष्पादित नहीं करते हैं तब तक एक निष्पादन योग्य को हैश में नहीं रखा जाता है। का निरीक्षण करें:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python निष्पादित होने के बाद ही हैशेड किया जाता है।
कैसे हैश में हैश की जांच करें
हैश की सामग्री bashसरणी में उपलब्ध हैं BASH_CMDS। आप देख सकते हैं कि कमांड के साथ इसमें क्या है declare -p BASH_CMDS। जब कोई नया शेल या सबस्क्रिप्शन खोला जाता है, तो हैश खाली होता है। जैसे ही वे उपयोग में लाए जाते हैं एक-एक करके कमांड जोड़े जाते हैं। एक नए खुले खोल से, निरीक्षण करें:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
whichऔर क्यों नहींpython?