"आरएम हैशेड" का क्या मतलब है?


58

मैं http://mywiki.wooledge.org/BashGuide/CommandsAndArguments से गुज़र रहा हूं और यहां आया हूं :

$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a shell builtin

थोड़ी देर पहले, गाइड ने बाश द्वारा समझाए गए विभिन्न प्रकार के आदेशों को सूचीबद्ध किया: उपनाम, फ़ंक्शन, बिल्डिंस, कीवर्ड और निष्पादन योग्य। लेकिन "हैशेड" का उल्लेख नहीं था। तो, इस संदर्भ में, "हैशेड" का क्या अर्थ है?

जवाबों:


59

यह एक प्रदर्शन की बात है; हर बार बाइनरी के लिए पूरे रास्ते को खोजने के बजाय इसे कहा जाता है, इसे जल्दी देखने के लिए एक हैश तालिका में डाल दिया गया है। तो कोई भी बाइनरी जो पहले से ही इस हैश टेबल में है, हैशेड है। यदि आप बायनेरिज़ को स्थानांतरित करते हैं, जब वे पहले से ही हैशेड कर चुके होते हैं, तब भी यह उन्हें उनके पुराने स्थान पर कॉल करने का प्रयास करेगा।

यह भी देखें help hash, या वहाँ अंतर्निहित कमांड के man bashलिए खोजें hash


15

जैसा कि अन्य ने हैश का उल्लेख किया है एक साहचर्य सरणी (कुंजी -> मान) है जो बैश रखता है ताकि जब एक कमांड निष्पादित हो जाए, तो बैश इस हैश को पहले खोजता है कि क्या डिस्क पर कमांड का स्थान पहले से ही पाया गया है $PATH, और वहां संग्रहीत है। जल्दी खोज के लिए।

आप हैश को उन आदेशों की एक सूची देकर प्रीलोड कर सकते हैं, जो आप चाहते हैं कि बैश होने पर उसे ढूंढा जाए। यह चर कहलाता है BASH_CMDS

मैन पेज से अंश

   BASH_CMDS
          An  associative  array  variable  whose members correspond to the 
          internal hash table of commands as maintained by the hash builtin.
          Elements added to this array appear in the hash table; unsetting 
          array elements cause commands to be removed from the hash table.

इसके अतिरिक्त यदि आप बैश मैन पेज को देखते हैं, तो एक खंड है, COMMAND EXECUTION जिसमें स्टेट मशीन का विवरण है, जो कमांड में प्रॉम्प्ट पर टाइप किए जाने पर बैश का उपयोग करता है।

अंश

   If the name is neither a shell function nor a builtin, and contains no 
   slashes, bash searches each element of the PATH for a directory con
   taining an executable file by that name.  Bash uses a hash table to 
   remember the full pathnames of executable files (see hash  under  SHELL
   BUILTIN COMMANDS below).  A full search of the directories in PATH is 
   performed only if the command is not found in the hash table.  If the
   search is unsuccessful, the shell searches for a defined shell function 
   named command_not_found_handle.  If that  function  exists,  it  is
   invoked  with  the  original command and the original command's arguments 
   as its arguments, and the function's exit status becomes the exit
   status of the shell.  If that function is not defined, the shell prints 
   an error message and returns an exit status of 127.

आप -lस्विच का उपयोग करके पता लगा सकते हैं कि वर्तमान में आपके हैश में क्या है ।

उदाहरण

$ hash -l
builtin hash -p /usr/bin/rm rm
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/ls ls

बहुत उपयोगी धन्यवाद। जब मैं एक पटकथा पर काम कर रहा हूं तो मुझे लगता है कि यह हैश चीज रास्ते में मिलती है। क्या इसे अक्षम या साफ़ करने का कोई तरीका है?
कोडीनिन्जा

10

hash एक बैश शेल निर्मित है जो कमांड के लिए हैशिंग प्रदान करता है।

hash [-lr] [-p filename] [-dt] [name]

सीधे घोड़े के मुंह से:

help hash

याद रखें या कार्यक्रम स्थानों को प्रदर्शित करें।

info Bash → शेल बिल्डिन कमांड्स → बॉर्न शेल बिल्डिंग्स

NAME तर्कों के रूप में निर्दिष्ट आदेशों के पूर्ण पथनामों को याद रखें, इसलिए उन्हें बाद के इनवोकेशन पर खोजने की आवश्यकता नहीं है। में सूचीबद्ध निर्देशिकाओं के माध्यम से खोज करके आदेश पाए जाते हैं $PATH-pविकल्प पथ खोज रोकता है, और FILENAME NAME का स्थान के रूप में प्रयोग किया जाता है। -rविकल्प याद किए गए सभी स्थानों भूल जाते हैं खोल कारण बनता है। -dविकल्प प्रत्येक नाम के याद स्थान भूलना खोल कारण बनता है। यदि -tविकल्प की आपूर्ति की जाती है, तो पूर्ण पथनाम जिसे प्रत्येक NAME मेल खाता है, मुद्रित किया जाता है। यदि NAME के ​​साथ कई NAME तर्क दिए जाते हैं -t, तो hashed के पूर्ण पथनाम से पहले मुद्रित किया जाता है। -lविकल्प उत्पादन एक प्रारूप है कि इनपुट के रूप में पुन: उपयोग किया जा सकता है में प्रदर्शित करने के लिए कारण बनता है। यदि कोई तर्क नहीं दिया जाता है, या यदि केवल-lआपूर्ति की गई है, याद किए गए आदेशों के बारे में जानकारी मुद्रित की जाती है। रिटर्न स्टेटस तब तक शून्य है जब तक NAME नहीं मिलता है या एक अवैध विकल्प की आपूर्ति नहीं की जाती है।

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