কেন `যা টাইপ করে that যেটি হ্যাশড` বলে?


31

শেল-বিল্টিনগুলির ক্ষেত্রে (যেমন typeনিজেই):

$ type type
type is a shell builtin

$ which type
<Doesn't return anything since it's a shell builtin, silently exits>

কমান্ডের ক্ষেত্রে (সাধারণত) (যেমন python):

$ type python
python is /usr/bin/python

$ which python
/usr/bin/python

ক্ষেত্রে which(যা অবস্থিত একটি কমান্ড /usr/bin/which)

$ type which
which is hashed (/usr/bin/which)
$ which which
/usr/bin/which

কেন যে type whichবলে which is hashed? whichহ্যাশ হওয়ার তাৎপর্য কী এবং আসলে এর অর্থ কী?

উত্তর:


40

আপনার সম্ভবত সম্ভবত একটি দীর্ঘ 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" )'

+1, বেশ ভাল ব্যাখ্যা। তবে কেন whichএবং এর জন্য নয় python?
जॉবিন

@ জোবিন আপডেট হওয়া উত্তর দেখুন।
1024

2
দেখে মনে হচ্ছে হ্যাশটি কেবল অবধি স্থায়ী থাকে যতক্ষণ না আমরা শেলটি ছাড়ি না। একবার আমরা টার্মিনালটি পুনরায় চালু করার পরে, এটি কমান্ডটি হ্যাশ হয়ে গেছে তা বলে না।
আদিত্য

1
@ আদিত্য হ্যাঁ আমি উত্তরে একটি বিভাগ যুক্ত করেছি।
1024

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