मैं कैसे Bash के पथ को निष्पादक के लिए साफ़ कर सकता हूँ?


256

जब मैं निष्पादन योग्य के लिए पूर्ण पथ निर्दिष्ट किए बिना किसी कार्यक्रम को निष्पादित करता हूं, और बश $PATHको खोजने के लिए बाइनरी को खोजने के लिए निर्देशिकाओं को खोजना होगा, तो ऐसा लगता है कि बैश किसी तरह के कैश में पथ को याद करता है। उदाहरण के लिए, मैंने स्रोत से तोड़फोड़ की एक बिल्ड स्थापित की /usr/local, फिर svnsync helpबैश प्रॉम्प्ट पर टाइप किया गया। बैश /usr/local/bin/svnsyncने "svnsync" के लिए बाइनरी स्थित किया और इसे निष्पादित किया। तब जब मैंने तोड़फोड़ की स्थापना को /usr/localफिर से हटाया और फिर से भागा svnsync help, तो बैश ने जवाब दिया:

bash: /usr/local/bin/svnsync: No such file or directory

लेकिन, जब मैं बैश का एक नया उदाहरण शुरू करता हूं, तो यह खोज और निष्पादित करता है /usr/bin/svnsync

मैं निष्पादनों के पथ को कैश कैसे साफ़ करूँ?


7
कभी stupidiest सुविधा
Romeno

जवाबों:


322

bashएक कमांड के लिए पूरा रास्ता कैश करता है। आप सत्यापित कर सकते हैं कि आप जिस कमांड को निष्पादित करने का प्रयास कर रहे हैं वह typeकमांड के साथ हैश किया गया है :

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

संपूर्ण कैश साफ़ करने के लिए:

$ hash -r

या सिर्फ एक प्रविष्टि:

$ hash -d svnsync

अतिरिक्त जानकारी के लिए, परामर्श करें help hashऔर man bash


15
@ डैनियल यह जोड़ने लायक है कि, बाश में, आप कमांड "टाइप कमांड " का उपयोग यह पता लगाने के लिए कर सकते हैं कि यह किस प्रकार का कमांड है - यदि आपका कमांड हैशेड है, तो "टाइप" आपको बताएगा। यह बताना उपयोगी है कि कुछ शेल शेलिन है या कोई अन्य।
लंचमीट 317

4
FYI के रूप में, कैश किए गए PATH को बदलने के लिए यदि रनिंग है csh, कमांड है rehash
कुर्टम

उपरोक्त rehashकमांड भी काम करता है zsh
नील ट्राफ

अधिक पूर्ण उत्तर के लिए unix.stackexchange.com/questions/86012/…
Ioannis Filippidis

4
एक कमांड में सेलेक्टिव रिहाशिंग द्वारा इनवाइट किया जा सकता है hash svnsync
Ioannis Filippidis

25

केवल एक प्रविष्टि को साफ़ करने के लिए आपको एक अलग ध्वज की आवश्यकता है:

hash -d svnsync

-rझंडा एक पैरामीटर नहीं ले करता है और हमेशा पूरा कैश को नष्ट करेगा।
(कम से कम बाश में 3.2.39 डेबियन लेन पर)


20

यहाँ उल्लिखित समाधान नहीं हैं।

  1. आप के साथ हैशिंग को अक्षम कर सकते हैं set +hयाset +o hashall

    help set कहते हैं:

    -h - कमांड के स्थान को याद रखें क्योंकि उन्हें निष्पादन के लिए देखा जाता है। यह डिफ़ॉल्ट रूप से सक्षम है।

    हैशेल - वही -एच

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    set +h
    date # normal date output
  2. आप जाँच कर सकते हैं कि हैश तालिका में पाया गया कमांड इसके साथ निष्पादित करने का प्रयास करने से पहले मौजूद है shopt -s checkhash

    help shopt कहते हैं:

    checkhash - यदि सेट किया गया है, तो यह जांचें कि हैश तालिका में पाया गया कमांड इसे निष्पादित करने का प्रयास करने से पहले मौजूद है। यदि कोई हैशेड कमांड मौजूद नहीं है, तो एक सामान्य पथ खोज की जाती है।

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    hash -t date # prints /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    shopt -s checkhash # enable command existence check
    date # normal date output
    hash -t date # prints /bin/date
  3. आप NAME को PATH के साथ hash -p PATH NAMEया उसके साथ बांध सकते हैं BASH_CMDS[NAME]=PATH:

    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    BASH_CMDS[date]=/bin/date
    date # normal date output
  4. जादू: PATH="$PATH"प्रदर्शन करता हैhash -r

    से variables.c:

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }

    प्रयत्न, कोशिश:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty

1
मुझे समझ में नहीं आया कि जब PATH = $ PATH ठीक काम करता है तो सभी अतिरिक्त तंत्र की आपूर्ति क्यों की जाती है। यदि PATH बदल जाता है, तो PATH लुकअप कैश को अमान्य कर दिया जाना चाहिए। समझ में आता है।
jrw32982

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

कमांड हैश टेबल के साथ मेसेज करना वास्तव में किसी को भ्रमित करने का एक शानदार तरीका है जो बैश स्क्रिप्ट को डीबग करने की कोशिश कर रहा है।
एरिक एरोनिटी

4

उपयोगकर्ता टोबू के जवाब के लिए एक टिप्पणी में उपयोगकर्ता जोहनेक्स ने उल्लेख किया है , बाश में सबसे सरल व्यावहारिक कार्रवाई सिर्फ आपके कार्यक्रम को फिर से करना है:

hash svnsync

बस इतना ही।

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