मेरा `कौन-सा` आदेश गलत हो सकता है (कभी-कभी)?


17

मैंने स्रोत कोड (v24.2) से अंतिम emacs संस्करण संकलित किया है क्योंकि मेरी मशीन पर स्थापित संस्करण मेरे लिए (v21.3) काफी पुराना है। मैंने हमेशा किया है:

$configure --prefix=$HOME
make 
make install

अब मैं emacs का परीक्षण कर रहा हूं और महसूस किया कि यह अभी भी पिछले संस्करण को लॉन्च कर रहा है ... जबकि मेरा $HOME/binरास्ता सिस्टम को ओवरराइड करने वाला है (क्योंकि यह मेरी .bashrcफाइल में $ PATH से जुड़ा हुआ है )।

मेरा पहला विचार whichकमांड आउटपुट को देखना था । और आश्चर्य, यह नए emacs को रास्ता देता है। मैं समझ नहीं पा रहा हूं कि यहां विसंगति कहां है। एक ही सत्र में यहाँ विभिन्न आउटपुट हैं:

$ emacs --version
GNU Emacs 21.3.1

$ `which emacs` --version
GNU Emacs 24.2.1

मैं कोई उर्फ ​​शामिल emacs है। बिल्कुल भी।

$ alias | grep emacs
$

किसी भी विचार कृपया क्या हो रहा है?


क्या जो emacs वापस आता है?
उलरिच डांगेल

जवाबों:


29

मेरे लिए दिमाग में आने वाली तीन संभावनाएँ:

  • एक उपनाम मौजूद है emacs(जिसकी आपने जाँच की है)
  • के लिए एक फ़ंक्शन मौजूद है emacs
  • नया emacsबाइनरी आपके शेल के PATH हैशटेबल में नहीं है।

आप देख सकते हैं कि आपके पास कोई फंक्शन है emacs:

bash-3.2$ declare -F | fgrep emacs
declare -f emacs

और इसे हटा दें:

unset -f emacs

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

hash -r

अतिरिक्त स्पष्टीकरण:

which कार्यों के बारे में नहीं जानता, क्योंकि यह बैश बिलिन नहीं है:

bash-3.2$ emacs() { echo 'no emacs for you'; }
bash-3.2$ emacs
no emacs for you
bash-3.2$ which emacs
/usr/bin/emacs
bash-3.2$ `which emacs` --version | head -1
GNU Emacs 22.1.1

इस स्क्रिप्ट द्वारा नए बाइनरी हैशटेबल व्यवहार का प्रदर्शन किया गया है।

bash-3.2$ PATH=$HOME/bin:$PATH
bash-3.2$ cd $HOME/bin

bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ echo echo hi > cat
bash-3.2$ chmod +x cat
bash-3.2$ cat nofile
cat: nofile: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
hi
bash-3.2$ rm cat
bash-3.2$ cat nofile
bash: /Users/mrb/bin/cat: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
cat: nofile: No such file or directory

हालाँकि, मैंने इसे कॉल नहीं किया, which catहमेशा catअपने पेटीएम में पहला लौटाऊंगा, क्योंकि यह शेल के हैशटेबल का उपयोग नहीं करता है।


1
जबकि यहां अच्छी जानकारी है, यह typeकमांड पर याद आती है ।
जोर्डनम

धन्यवाद, मेरे पास sqlite3 के एक ताज़ा संकलित संस्करण के साथ एक ही मुद्दा था जिसने मुझे अखरोट (जो वास्तव में सही रास्ता लौटाया था, लेकिन शेल ने सही sqlite3 cli नहीं कहा था)। hash -rमेरा मुद्दा ठीक किया
mpm

12

हाँ, जो प्रयोग न करें :

  • कुछ प्रणालियों पर, यह एक बाहरी कमांड है जिसे csh स्क्रिप्ट के रूप में कार्यान्वित किया जाता है, जो एक कॉन्फ़िगरेशन को पढ़ सकता है जो इसे बदलता है PATH
  • उसके लिए एक बिलिन है। दो, यहां तक ​​कि: typeऔर command। POSIX तरीका:

    command -v emacs       # machine-readable format
    type emacs             # human-only format

    बैश में, आप type -p emacsकेवल एक बाहरी कमांड का मार्ग देखने के लिए भी उपयोग कर सकते हैं ।

हालांकि, यहां, whichवास्तव में सही है। बैश मेमोरी में कमांड के स्थान के बारे में जानकारी रखता है, ताकि यह अगली बार कमांड को तेजी से निष्पादित कर सके। आपने अपने emacsपर एक नया निष्पादन योग्य स्थापित किया है PATH, लेकिन अभी भी इसके कैश में पुराने स्थान हैं। फिर hash emacsसे देखने के लिए emacs, या hash -rकैश खाली करने के लिए चलाएँ ।


1

क्या आपने अपनी अपडेट की गई .bashrcलॉगिन फ़ाइल को फिर से पढ़ने के लिए लॉगआउट और लॉगिन किया था ? यदि नहीं, तो आपके वर्तमान सत्र का वातावरण अपडेट नहीं किया गया है।


अगर ऐसा `which emacs` --versionहोता , तो इससे सहमत होते emacs --version, क्योंकि whichवर्तमान पथ से इसका पैठ विरासत में मिलता है।
mrb

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