पथ में निष्पादकों के कैश को अक्षम करें


12

ध्यान दें कि यह कोई डुप्लिकेट नहीं है। मैं कैश को अक्षम करने के बारे में पूछ रहा हूं , इसे साफ नहीं कर रहा हूं । यदि आपके पास स्पष्ट करने के लिए कैश है, तो यह स्पष्ट रूप से अक्षम नहीं है।

जिन दुर्लभ अवसरों पर मैंने बैश की चीजों को कैश में देखा है, जो इसे रास्ते में मिला है, ऐसा नहीं है क्योंकि यह मददगार है, यह इसलिए है क्योंकि यह खूनी कष्टप्रद है। एक उदाहरण:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

एक और खोल में ...

~ dc$ which which
/usr/bin/which

मुझे यकीन है कि यह कैचिंग अच्छे पुराने दिनों में वापस आ गई थी जब डिस्क धीमी थी और मेमोरी महंगी और सीमित थी और इसलिए आप बहुत कैश नहीं कर सकते थे - एक कमांड को खोजने के लिए आवश्यक सभी डिस्क ब्लॉक को कैशिंग करने की तुलना में एक पथ कैशिंग सस्ता है । लेकिन इन दिनों यह ध्यान देने योग्य लाभ प्रदान करता है और इससे अधिक समस्याओं का कारण बनता है। यह एक मिसफिट है, एक बग होने की पुष्टि करता है।

और मैं इसे अक्षम करने का एक तरीका भी नहीं खोज सकता। कोई संकेत?


1
डेस्कटॉप मशीन के सामान्य मामले में भी लाभ ध्यान देने योग्य है, अगर आपके पास इतनी रैम नहीं है जो /usr/binपूरी तरह से कैश में बनी रहे।
गाइल्स का SO- बुराई को रोकना '

1
@ मित्र, क्षमा करें। मैंने इस प्रश्न को डुप्लिकेट के रूप में चिह्नित किया है। set +hहैशिंग को निष्क्रिय करने के लिए उपयोग करें ।
एवगेनी वीरशैगिन

निक्सस में, यह अपने हैश में हैश को अक्षम करता है। मुझे लगता है, निक्स के काम करने के तरीके के कारण एक अच्छा कारण है। हालांकि, मुझे यकीन नहीं है कि यह निक्स के लिए वास्तव में अनिवार्य है। मैं केवल यह कह रहा हूं, कि हैश में एक हैश कुछ स्थितियों में समस्याएं ला सकता है।
टाइपेलॉजिक

जवाबों:


12

प्रॉम्प्ट के तैयार होने से पहले आप हैशेड निष्पादनयोग्य को साफ कर सकते हैं:

PROMPT_COMMAND='hash -r'

से help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.

1
के बारे में मेरा जवाब देखेंset +h
एवगेनी वीरशैगिन

1
@EvgenyVereshchagin set +hकई उपयोगिताओं (जैसे रूबी रत्न की स्थापना) कॉल के रूप में आदर्श नहीं है, चेतावनी की hashधाराओं का निर्माण -bash: hash: hashing disabled
डेविड मोल्स

मैं भी पायथन virtualenv सक्रियण में एक ही चेतावनी संदेश देखते हैं। लेकिन मुझे लगता है, यह हानिरहित है।
टाइपेलोजिक

8

यदि हैश तालिका में कोई कमांड मौजूद नहीं है, तो आप नए पथ लुकअप को करने के लिए बाध्य कर सकते हैं।

shopt -s checkhash

बैश के मैनपेज से:

checkhash

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

उदाहरण:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.