আমি কীভাবে কার্যকর করতে বাশের ক্যাশে সাফ করব?


256

আমি যখন এক্সিকিউটেবলের পুরো পথটি নির্দিষ্ট না করেই কোনও প্রোগ্রাম চালিত করি এবং বশাকে $PATHবাইনারি সন্ধান করতে অবশ্যই ডিরেক্টরিগুলি অনুসন্ধান করতে হবে, মনে হয় বাশ কোনও ধরণের ক্যাশে পথটি মনে রাখে। উদাহরণস্বরূপ, আমি উত্স থেকে সাবভার্সনের একটি বিল্ড ইনস্টল করেছি /usr/local, তারপরে svnsync helpবাশ প্রম্পটে টাইপ করেছি । বাশ /usr/local/bin/svnsync"svnsync" এর জন্য বাইনারি স্থাপন করে এবং এটি সম্পাদন করে। তারপরে আমি যখন সাবভার্সনের ইনস্টলেশন মুছে ফেলা /usr/localএবং পুনরায় সঞ্চালিত হই svnsync help, তখন বাশ প্রতিক্রিয়া জানায়:

bash: /usr/local/bin/svnsync: No such file or directory

তবে আমি যখন বাশের একটি নতুন উদাহরণ শুরু করি তখন এটি সন্ধান করে এবং কার্যকর করে /usr/bin/svnsync

এক্সিকিউটেবলের পাথের ক্যাশে আমি কীভাবে সাফ করব?


7
কি stupidiest বৈশিষ্ট্য
Romeno

উত্তর:


322

bashকমান্ডের পুরো পথটিকে ক্যাশে করে। আপনি যে কমান্ডটি কার্যকর করতে চেষ্টা করছেন তা typeআদেশ দ্বারা হ্যাশ হয়েছে তা আপনি যাচাই করতে পারেন :

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

সম্পূর্ণ ক্যাশে সাফ করার জন্য:

$ hash -r

বা কেবল একটি প্রবেশ:

$ hash -d svnsync

অতিরিক্ত তথ্যের জন্য, পরামর্শ help hashএবং man bash


15
@ ড্যানিয়েল এটি যুক্তিযুক্ত যে, বাশ-তে আপনি "টাইপ কমান্ড " কমান্ডটি ব্যবহার করতে পারেন এটি কী ধরণের আদেশ রয়েছে তা জানার জন্য - যদি আপনার কমান্ডটি হ্যাশ করা হয় তবে "টাইপ" আপনাকে বলবে। এটি কোনও শেল বিল্টিন বা একটি উপনাম কিনা তা জানানোও কার্যকর।
লাঞ্চমিট317

4
এফওয়াইআই হিসাবে, ক্যাশেড প্যাথএইচটি পরিবর্তন করতে csh, চলমান থাকলে কমান্ডটি হয় rehash
কুর্তম

উপরের rehashকমান্ডটিও কাজ করে zsh
নিল ট্রাফট

আরও সম্পূর্ণ উত্তরের জন্য দেখুন ইউনিক্স.স্ট্যাকেক্সেঞ্জাং.কম
আইওনিস ফিলিপিসিস

4
একটি কমান্ডের মধ্যে নির্বাচনী পুনর্নির্মাণের মাধ্যমে আহ্বান করা যেতে পারে hash svnsync
আইওনিস ফিলিপিসিস

25

কেবল একটি প্রবেশিকা সাফ করার জন্য আপনার আলাদা পতাকা দরকার:

hash -d svnsync

-rপতাকা একটি প্যারামিটার নেয় না এবং সবসময় সমগ্র ক্যাশে মুছে ফেলবে।
(ডেবিয়ান লেনির উপর কমপক্ষে 3.2.39 বাশ এ)


20

এখানে সমাধানগুলি উল্লেখ করা হয়নি।

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

    help set বলেছেন:

    -h - কমান্ডের অবস্থানটি মনে রাখবেন যেহেতু তারা কার্যকর করার জন্য অনুসন্ধান করা হয়। এটি ডিফল্টরূপে সক্ষম করা হয়েছে।

    hashall - একই হিসাবে -h

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    set +h
    date # normal date output
  2. আপনি এটি পরীক্ষা করে দেখার আগে হ্যাশ টেবিলের মধ্যে পাওয়া একটি কমান্ড উপস্থিত রয়েছে তা পরীক্ষা করতে পারেন shopt -s checkhash

    help shopt বলেছেন:

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

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    hash -t date # prints /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    shopt -s checkhash # enable command existence check
    date # normal date output
    hash -t date # prints /bin/date
  3. আপনি NAME কে PATH এর সাথে hash -p PATH NAMEবা এর সাথে আবদ্ধ করতে পারেন BASH_CMDS[NAME]=PATH:

    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    BASH_CMDS[date]=/bin/date
    date # normal date output
  4. যাদু: PATH="$PATH"সম্পাদন করেhash -r

    থেকে variables.c:

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }

    চেষ্টা করুন:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty

1
আমি কখনই বুঝতে পারি না যে সমস্ত অতিরিক্ত প্রক্রিয়া যখন PATH = AT पथ ঠিকঠাক কাজ করে তখন কেন সরবরাহ করা হয়। যদি PATH পরিবর্তন হয়, তবে PATH লুকানো ক্যাশেটি অবৈধ করা উচিত। ইন্দ্রিয় তোলে।
jrw32982

এক্সিকিউটেবলের অবস্থান পরিবর্তন করার সাথে সাথে যখন PATH পরিবর্তন হয় তখন ক্যাশেটিকে অকার্যকর করে ব্যবহারের কেস পরিচালনা করা হয় না। আপনি সাধারণ প্রোগ্রাম যুক্ত করতে বা অপসারণের জন্য শেলটি ব্যবহার করার সময় এটি সাধারণ হতে পারে, কেবলমাত্র এটি খুঁজে পাওয়া শেষ স্থানে ক্যাশে রাখার জন্য।
অ্যাডাম 21

কমান্ড হ্যাশ টেবিলের সাথে জগাখিচুড়ি করা বাশ স্ক্রিপ্টটি ডিবাগ করার চেষ্টা করছে এমন কাউকে সত্যই বিভ্রান্ত করার একটি দুর্দান্ত উপায়।
এরিক অ্যারোনস্টি

4

ব্যবহারকারী হিসাবে johntex একটি মন্তব্য উল্লেখ করা হয়েছে উত্তর ব্যবহারকারী দ্বারা Tobu , ব্যাশ মধ্যে সবচেয়ে সহজ ব্যবহারিক কর্ম শুধু আপনার প্রোগ্রাম rehash করা:

hash svnsync

এখানেই শেষ.

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