क्यों `प्रकार है जो` कहते हैं कि `जो हैशेड` है?


31

शेल-बिल्डिंस के मामले में (उदाहरण typeके लिए):

$ type type
type is a shell builtin

$ which type
<Doesn't return anything since it's a shell builtin, silently exits>

आदेशों के मामले में (सामान्य रूप से) (उदाहरण के लिए python):

$ type python
python is /usr/bin/python

$ which python
/usr/bin/python

के मामले में which(जो एक कमांड स्थित है /usr/bin/which)

$ type which
which is hashed (/usr/bin/which)
$ which which
/usr/bin/which

ऐसा क्यों type whichकहता है which is hashed? whichहैशेड होने का महत्व क्या है और इसका वास्तव में क्या मतलब है?

जवाबों:


40

आपके पास संभवतः एक लंबा पैट सेट है और, एक निष्पादन योग्य खोजने के लिए, शेल को पथ की खोज करने की आवश्यकता है। उस समय लेने वाली प्रक्रिया से बचने के लिए हर बार जब आप एक कार्यक्रम चलाना चाहते हैं, तो शेल उन कार्यक्रमों की एक सूची रख सकता है जो इसे पहले ही मिल चुका है। उस सूची को "हैश" कहा जाता है। जब शेल कहता है कि 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" )'

+1, बहुत अच्छी व्याख्या। लेकिन के लिए whichऔर क्यों नहीं python?
जॉबिन

@ जोबिन अद्यतन जवाब देखें।
1910 में जॉन 1024

2
ऐसा लगता है कि जब तक हम शेल से बाहर नहीं निकलते, तब तक हैश बनी रहती है। एक बार जब हम टर्मिनल को फिर से शुरू करते हैं, तो यह नहीं कहता है कि कमांड हैशेड है।
आदित्य

1
@ आदित्य हां। मैंने उत्तर पर एक खंड जोड़ा।
जॉन 1024

hash -lकी तुलना में उपयोग करने में आसान होगाdeclare -p BASH_CMDS
phuclv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.