হ্যাশ আদেশের উদ্দেশ্য কী?


116

আপনি যদি hashএটি চালনা করেন তবে হ্যাশ শেষবারের মতো পুনরায় সেট হয়ে যাওয়ার পরে এটি সমস্ত কমান্ডের চলমান পথ দেখায় hash -r)

[root@c04c ~]# hash
hash: hash table empty

[root@c04c ~]# whoami
root

[root@c04c ~]# hash
hits    command
   1    /usr/bin/whoami

[root@c04c ~]# whoami
root

[root@c04c ~]# hash
hits    command
   2    /usr/bin/whoami

ম্যান পেজ অনুসারে হ্যাশের উদ্দেশ্য হ'ল:

/ Usr / বিন / হ্যাশ ইউটিলিটি বর্তমান শেল পরিবেশের পাওয়া ইউটিলিটির অবস্থানগুলি যেভাবে মনে করে তা প্রভাবিত করে। নির্দিষ্ট আর্গুমেন্টগুলির উপর নির্ভর করে, এটি তার স্মরণযোগ্য অবস্থানগুলির তালিকায় ইউটিলিটি অবস্থানগুলি যুক্ত করে বা এটি তালিকার বিষয়বস্তুগুলি পরিষ্কার করে। যখন কোনও যুক্তি নির্দিষ্ট না করা থাকে, তখন এটি তালিকার বিষয়বস্তুগুলিতে রিপোর্ট করে। -rবিকল্প সব মনে পড়ল অবস্থানে ভুলে যেতে শেল ঘটায়।

শেলের বিল্ট-ইন হিসাবে সরবরাহ করা ইউটিলিটিগুলি হ্যাশ দ্বারা প্রতিবেদন করা হয় না।

আমি কমান্ডটি কতবার enteredুকেছি তা ছাড়া, আমি এর ইউটিলিটিটি দেখতে পাচ্ছি না hash

এটি thegeekstuff.com এর শীর্ষ 15 টি দরকারী কমান্ডেও বৈশিষ্ট্যযুক্ত ছিল

কোন উপায়ে hashদরকারী?

উত্তর:


94

hashহ'ল বাশ অন্তর্নির্মিত কমান্ড। হ্যাশ টেবিলটি এমন একটি বৈশিষ্ট্য bash যা $PATHআপনি মেমরিতে ফলাফলগুলি ক্যাশে করে প্রতিবার কোনও কমান্ড টাইপ করার সময় এটি অনুসন্ধান করতে বাধা দেয় । ফলাফলগুলি স্পষ্টতই অকার্যকর করে এমন ইভেন্টগুলিতে সারণী সাফ হয়ে গেছে (যেমন সংশোধন করা $PATH)

hashকমান্ড শুধু আপনি যে সিস্টেম (যেটা কারণ আপনি মনে করেন করার জন্য আপনাকে করতে হবে) কিভাবে আচরণ করা হয়।

কিছু ব্যবহারের ক্ষেত্রে:

  • আপনি দেখেছেন যে আপনি কোনও আর্গুমেন্ট না দিয়ে টাইপ করলে কোন আদেশটি আপনি কতবার আঘাত করেছেন তা মুদ্রণ করেছে। এটি আপনাকে বলতে পারে আপনি কোন আদেশগুলি বেশিরভাগ ক্ষেত্রে ব্যবহার করেন।

  • আপনি এটি অ-মানক স্থানে এক্সিকিউটেবলের মনে রাখতে ব্যবহার করতে পারেন।

উদাহরণ:

[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you're thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#

ডিরেক্টরিতে থাকা $PATHসমস্ত কিছু অন্তর্ভুক্ত করার পরিবর্তে কেবলমাত্র নামটি টাইপ করে চালাতে চান তার বাইরে যে কোনও ডিরেক্টরিতে আপনার কেবলমাত্র একক এক্সিকিউটেবল থাকলে এটি কার্যকর হতে পারে (এটি যদি আপনি যুক্ত করেন তবে এটি কার্যকর হবে $PATH)।

একটি উপাধি সাধারণত এটিও করতে পারে, যদিও এবং যেহেতু আপনি বর্তমান শেলটির আচরণটি পরিবর্তন করছেন, তাই আপনি যে প্রোগ্রামগুলিকে সরিয়ে ফেলেন সেটি ম্যাপ করা যায় না। একাকী এক্সিকিউটেবলের কাছে একটি সিমিলিংক সম্ভবত এখানে পছন্দনীয় বিকল্প। hashএটি করার একটি উপায়।

  • আপনি এটি ফাইলের পাথগুলি স্মরণে না রাখতে ব্যবহার করতে পারেন। এটি কার্যকর যদি কোনও নতুন এক্সিকিউটেবল আগের PATHডিরেক্টরিতে পপ আপ করে বা mvঅন্য কোথাও গিয়ে পৌঁছে এবং আপনি বাশকে বাইরে বেরিয়ে যেতে বাধ্য করতে চান এবং এটি খুঁজে পাওয়ার মনে রাখার শেষ স্থানের পরিবর্তে এটি আবার খুঁজে পেতে চান।

উদাহরণ:

[root@policyServer ~]# hash
hits    command
   1    /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits    command
   1    /bin/cp
   1    /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif  newDIT.ldif  notes.txt  users.ldif
[root@policyServer ~]# hash
hits    command
   1    /bin/cp
   1    /lol-wut/ls
[root@policyServer ~]#

cpকমান্ড এর একটি নতুন সংস্করণ সৃষ্ট lsএক্সিকিউটেবল আমার আগের প্রদর্শিত করতে $PATHকিন্তু হ্যাশ টেবিল একটি রেচক পদার্থ চাপেনি। আমি hash -dনির্বাচনের জন্য lsহ্যাশ টেবিল থেকে প্রবেশ এন্ট্রি শুদ্ধ করতে ব্যবহৃত । এরপরে বাশকে $PATHআবারও সন্ধান করতে বাধ্য করা হয়েছিল এবং এটি যখন ঘটেছিল তখন এটি এটি নতুন অবস্থানে খুঁজে পেয়েছিল (আগের তুলনায় AT পাথের আগে)।

আপনি বেছে বেছে এই $PATHআচরণ থেকে "কার্যকর করার নতুন জায়গা সন্ধান করুন " আচরণ করতে পারেন, যদিও:

[root@policyServer ~]# hash
hits    command
   1    /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits    command
   0    /lol-wut/ls
[root@policyServer ~]#

আপনি বেশিরভাগই কেবল এটি করতে চাইতেন যদি আপনি হ্যাশ টেবিলের বাইরে কিছু চান এবং 100% না হন যা আপনি লগ আউট করতে পারেন এবং সফলভাবে ফিরে আসতে পারেন, বা আপনি নিজের শেলটিতে কিছু পরিবর্তন সংরক্ষণ করতে চেয়েছিলেন।

বাসি ম্যাপিং থেকে পরিত্রাণ পেতে, আপনি এটিও করতে পারেন hash -r(বা export PATH=$PATH) যা কার্যকরভাবে কেবল বাশের পুরো হ্যাশ টেবিলকে বিশুদ্ধ করে।

এর মতো ছোট্ট অনেকগুলি পরিস্থিতি রয়েছে। আমি এটিকে "সবচেয়ে দরকারী" কমান্ডগুলির মধ্যে একটি বলি কিনা জানি না তবে এতে কিছু ব্যবহারের ঘটনা রয়েছে cases


আমি ভাবছি 'হ্যাশ' নামটি কোথা থেকে এসেছে। উদাহরণস্বরূপ "ক্যাশে" সম্পর্কে কি, তবে? :)।
মাইকেল 20

2
@ মিশেল কারণ hashকমান্ডটি ম্যাপিংগুলি সঞ্চয় করতে অভ্যন্তরীণভাবে একটি হ্যাশ টেবিল ব্যবহার করে। en.wikipedia.org/wiki/Hash_table
jlliagre

10
এটি লক্ষ করা উচিত যে সুনির্দিষ্ট hashনয় bash, কমান্ডটি উত্সটি বোর্ন শেল থেকে এসভিআর 2 (যদিও কমান্ডের হ্যাশিং পাথের বৈশিষ্ট্যটি এর cshআগে থেকেই এসেছে ) এবং সমস্ত বোর্নের মতো এবং পসিক্স শেলগুলিতে পাওয়া যায়।
স্টাফেন চেজেলাস

1
export PATH=$PATHটেবিলটি সাফ করার পরিবর্তে hash -rযথেষ্ট হওয়া উচিত।
রাভ্রন

1
আরেকটি ব্যবহারের ক্ষেত্রে হ'ল আপনার $ PATH এর পূর্ববর্তী অংশে কোনও প্রোগ্রামের দ্বিতীয় কপি ইনস্টল করার সময়। আপনার দরকার hash -rবা আপনি পুরানো সংস্করণটি পাবেন কারণ $ PATH পরিবর্তন হয়নি এবং বাশ বুঝতে পারে না যে এটি একই প্রোগ্রামটি আগের (উচ্চতর অগ্রাধিকার) ডিরেক্টরি থেকে লোড করতে পারে। বিস্তারিত জানার জন্য কনডা.পিডেটা.আর
জন জুইনক

37

এখানে ক্লাসিক ব্যবহার, সরলীকৃত:

# My PATH contains /home/rici/bin as well as the Usual Suspects:
# (the real one has lots more)
$ echo $PATH
/home/rici/bin:/usr/local/bin:/usr/bin:/bin

# I've installed a program called hello in /usr/local/bin
$ $ cat /usr/local/bin/hello
#!/bin/bash

echo Hello, world. I live at $0

# The program works.
$ hello
Hello, world. I live at /usr/local/bin/hello

# Now I want to create a better hello, just for me. I put it in
# my own bin directory, and according to my PATH, it should come first.
$ cp /usr/local/bin/hello ~/bin/hello

# So now I will try running it
$ hello
Hello, world. I live at /usr/local/bin/hello

# WTF? Oh, forgot to run hash.
# Tell bash to update where to look for hello
$ hash hello
$ hello
Hello, world. I live at /home/rici/bin/hello

# Ah, all is well.

এখানে উল্লিখিত হিসাবে হ্যাশ টেবিলের নির্বাচনী আপডেট একক কমান্ডের সাহায্যে আহ্বান করা যেতে পারে hash hello
ইওনিস ফিলিপিসিস

@ জোহনটেক্স: ঠিক আছে, পরিবর্তিত হয়েছে।
ধনী

হ্যাশ টেবিল বিদ্যমান তা জানার আগে অদ্ভুত বাগগুলির সম্ভাবনাটি কল্পনা করুন! হ্যাশ টেবিলটি স্বয়ংক্রিয়ভাবে সতেজ হয়ে উঠলে এমন পরিস্থিতির কোনও তালিকা রয়েছে?
বেনজিমিন

@ বেঞ্জি: এটি কখনই স্বয়ংক্রিয়ভাবে সতেজ হয় না (সামগ্রিকভাবে)। আপনি যদি প্যাসিক্স মোডে বাশ চালনা করেন বা setopt -s checkhashকোনও কমান্ডের জন্য এক্সিকিউটেবল হ্যাশ উপস্থিত থাকে না, তবে সেই কমান্ডের জন্য হ্যাশ এন্ট্রি আপডেট করা হবে। তবে মনে রাখবেন যে প্রতিটি বাশ সেশনের নিজস্ব হ্যাশ টেবিল ছিল, সুতরাং সেশনটি বন্ধ করে এবং একটি নতুন কার্যকরভাবে কার্যকরভাবে হ্যাশটি খালি করে। ( hash -rএটি করার সহজ উপায়))
ধনী

আপডেট করা $PATH, বা নতুন ব্যাশ টার্মিনাল চালু করা, উভয়ই টেবিলটি পরিষ্কার করার জন্য উপস্থিত রয়েছে।
বেনজিমিন

17

এখানে একটি দরকারী ব্যবহার hash:

hash php 2> /dev/null || hash -p /usr/local/foobar/php/bin/php php 2> /dev/null

এর অর্থ: পিএইচপি যদি PATH এ না থাকে তবে ব্যবহার করুন

/usr/local/foobar/php/bin/

7

হ্যাঁ, বাশ রেফারেন্স ম্যানুয়াল বলেছেন:

হ্যাশ টেবিলের মধ্যে কমান্ডটি পাওয়া না গেলেই $ PATH- র ডিরেক্টরিগুলির সম্পূর্ণ অনুসন্ধান করা হয়।

তবে আপনি এর সাথে হ্যাশিং অক্ষম করতে পারেন set +h:

-h - (হ্যাশ) কমান্ডগুলি কার্যকর করার জন্য সন্ধান করার সাথে সাথে সনাক্ত করুন এবং মনে রাখবেন। এই বিকল্পটি ডিফল্টরূপে সক্রিয় করা হয়।

চেষ্টা করুন:

set +h
hash # prints bash: hash: hashing disabled
echo $? # prints 1

একই জন্য hash -r, hash NAMEইত্যাদি

একটি "কমান্ড সনাক্তকরণ" (মত এই বা যে ) কাজ করে না:

set -h
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2 # prints nothing

set +h
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2 # prints Please install ls

আপনি এই জাতীয় কিছু লিখতে পারেন:

old_options="$-"
set -h
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2
[[ "$old_options" =~ "h" ]] || set +h

অথবা (মাইক্রোজারকে ধন্যবাদ) কোনও নতুন ভেরিয়েবল বরাদ্দ না করে বা কোনও পরীক্ষা না করে:

set -h -- "-${-:--}" "$@"
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2
set +h "$@"

1
আপনার old_optionsজিনিসটির জন্য - আমি সাধারণত set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"এটির মতো কিছু করি: সুতরাং এটি কোনও নতুন ভেরিয়েবল বরাদ্দ না করে বা কোনও পরীক্ষা বা কিছু না করে স্বয়ংক্রিয়ভাবে পড়ে যায় place
মাইকজার্ভ

5

একটি কমান্ড উপলব্ধ কিনা তা সহজ সনাক্তকরণ:

CMD=gzip
if hash bzip2; then
    CMD=$_
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.