আপনার সম্ভবত সম্ভবত একটি দীর্ঘ PATH সেট রয়েছে এবং একটি এক্সিকিউটেবলের সন্ধানের জন্য, শেলের জন্য পথটি অনুসন্ধান করা দরকার। আপনি যখনই কোনও প্রোগ্রাম চালাতে চান সেই সময় গ্রহণ প্রক্রিয়াটি এড়াতে, শেলটি ইতিমধ্যে এটি খুঁজে পাওয়া প্রোগ্রামগুলির একটি তালিকা রাখতে পারে। সেই তালিকাটিকে "হ্যাশ" বলা হয়। যখন শেলটি বলে যে which
এটি হ্যাশ হয়েছে, এর অর্থ হ'ল এটি ইতিমধ্যে PATH অনুসন্ধান করেছে এবং হ্যাশটিতে which
এটির অবস্থান খুঁজে পেয়েছে এবং সংরক্ষণ করেছে।
man bash
এটি নিম্নলিখিত হিসাবে ব্যাখ্যা করে:
এক্সিকিউটেবল ফাইলের পুরো পথের নামগুলি মনে রাখতে বাশ হ্যাশ টেবিল ব্যবহার করে (নীচে শেল বিল্টিন কম্যান্ডের অধীনে হ্যাশ দেখুন)। হ্যাশ টেবিলের মধ্যে কমান্ডটি পাওয়া না গেলেই PATH- র ডিরেক্টরিগুলির সম্পূর্ণ অনুসন্ধান করা হয়।
যদিও হ্যাশটি সাধারণত শেল অপারেশনগুলিকে গতি দেয়, এমন একটি ক্ষেত্রে রয়েছে যা এটি সমস্যার কারণ হয়ে থাকে। আপনি যদি নিজের সিস্টেম আপডেট করেন এবং ফলস্বরূপ, কিছু এক্সিকিউটেবল নতুন স্থানে চলে যায় তবে শেলটি বিভ্রান্ত হতে পারে। সমাধানটি চালানো হয় hash -r
যার ফলে শেলটি সমস্ত হ্যাশযুক্ত অবস্থানগুলি ভুলে যায় এবং স্ক্র্যাচ থেকে PATH অনুসন্ধান করে।
কেন কিছু এক্সিকিউটেবল হ্যাশ থেকে অনুপস্থিত?
আপনি অন্তত একবার মৃত্যুদন্ড কার্যকর করার আগ পর্যন্ত এক্সিকিউটেবলকে হ্যাশে স্থাপন করা হয় না। পালন:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python
এটি কার্যকর হওয়ার পরেই তাড়িত করা হয়।
বাশের হ্যাশ কী রয়েছে তা কীভাবে পরীক্ষা করবেন
হ্যাশের সামগ্রীগুলি bash
অ্যারেতে উপলব্ধ BASH_CMDS
। কমান্ডের সাহায্যে এটিতে কী আছে তা দেখতে পাবেন declare -p BASH_CMDS
। যখন একটি নতুন শেল বা সাবশেল খোলা হয়, হ্যাশটি খালি থাকে। কমান্ডগুলি ব্যবহার করার সাথে সাথে একে একে যুক্ত করা হয়। নতুন খোলা শেল থেকে পর্যবেক্ষণ করুন:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
which
এবং এর জন্য নয়python
?