আমার `কোন` আদেশটি ভুল হতে পারে (কখনও কখনও)?


17

আমি সোর্স কোড (v24.2) থেকে শেষ ইমাস সংস্করণটি সংকলন করেছি কারণ আমার মেশিনে ইনস্টল করা সংস্করণটি আমার জন্য বেশ (পুরানো) পুরানো (v21.3)। আমি সাধারন কাজটি করেছি:

$configure --prefix=$HOME
make 
make install

এখন আমি ইমাস পরীক্ষা করছি এবং বুঝতে পেরেছি যে এটি এখনও পূর্ববর্তী সংস্করণ চালু করে ... যদিও আমার $HOME/binপাথটি সিস্টেমটিকে একটি ওভাররাইড করার কথা রয়েছে (যেহেতু এটি আমার .bashrcফাইলে $ PATH তে প্রেরেন্টড )।

আমার প্রথম চিন্তা whichকমান্ড আউটপুট দেখতে ছিল । এবং অবাক করা, এটি নতুন ইমাসকে পথ দেয়। এখানে তাত্পর্য কোথায় তা আমি বুঝতে পারি না। একই সেশনে এখানে বিভিন্ন আউটপুট রয়েছে:

$ emacs --version
GNU Emacs 21.3.1

$ `which emacs` --version
GNU Emacs 24.2.1

ইমাস জড়িত আমার কোনও উলাম নেই। মোটেই

$ alias | grep emacs
$

কোন ধারণা কি চলছে দয়া করে?


কোন ইমাস ফিরে আসে?
উলরিচ ড্যাঙ্গেল

উত্তর:


29

আমার জন্য যে তিনটি সম্ভাবনা মনে আসে:

  • একটি উপনাম উপস্থিত রয়েছে emacs(যা আপনি পরীক্ষা করেছেন)
  • জন্য একটি ফাংশন বিদ্যমান emacs
  • নতুন emacsবাইনারি আপনার শেলের প্যাথ হ্যাশটেবলে নেই।

আপনার কোনও ফাংশন রয়েছে কিনা তা পরীক্ষা করতে পারেন emacs:

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

এবং এটি সরান:

unset -f emacs

আপনার শেলটিতে একটি PATH হ্যাশটেবল রয়েছে যা আপনার পাঠের প্রতিটি বাইনারি সম্পর্কিত রেফারেন্স ধারণ করে contains যদি আপনি আপনার পাথের অন্য কোথাও বিদ্যমান নামে একই নামের সাথে একটি নতুন বাইনারি যুক্ত করেন, শ্যাশটি হ্যাশটেবল আপডেট করে জানাতে হবে:

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কমান্ডটি বাদ দেয় ।
জর্ডানম

ধন্যবাদ, আমার স্ক্যালাইট 3 এর নতুন সংকলিত সংস্করণটি একই ছিল যা আমাকে বাদাম করেছে (যা আসলে সঠিক পথে ফিরে এসেছে, তবে শেলটি সঠিক স্ক্লাইট 3 ক্লাইটকে কল দেয়নি)। hash -rআমার সমস্যা ঠিক করেছিলাম।
এমএমএম

12

হ্যাঁ, যা ব্যবহার করবেন না :

  • কয়েকটি সিস্টেমে, এটি একটি csh শেল স্ক্রিপ্ট, যা একটি কনফিগারেশন যে পরিবর্তন পড়তে পারেন হিসাবে প্রয়োগ করা একটি বহিস্থিত কমান্ড এর PATH
  • তার জন্য একটি বিল্টিন রয়েছে। দুই, এমনকি: typeএবং command। পসিক্স উপায়:

    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

@ এমআরবি: পয়েন্ট ভালভাবে নেওয়া হয়েছে।
জেআরফেরগসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.