নকল এন্ট্রি D PATH এ সমস্যা?


45

আমি আমার কয়েকজন বন্ধুকে বাশার্কের উত্স দিয়েছি। সুতরাং আমি আমার AT PATH ভেরিয়েবলে সদৃশ এন্ট্রি পেয়েছি। কমান্ডগুলি শুরু হতে দীর্ঘ সময় নিলেও সমস্যাটি কিনা তা আমি নিশ্চিত নই। কীভাবে AT পাথ অভ্যন্তরীণভাবে ব্যাশে কাজ করে? আরও পাঠাথ কি আমার শুরু করার সময়কে ধীর করে দেবে?




উত্তর:


42

আরও বেশি এন্ট্রি থাকা $PATHআপনার সরাসরি প্রারম্ভিক গতি কমায় না, তবে শেল সেশনে আপনি প্রথমে কোনও নির্দিষ্ট কমান্ড চালানোর সময় ধীর হয়ে যায় (প্রতিবার আপনি কমান্ডটি চালাবেন না, কারণ বাশ একটি ক্যাশে বজায় রাখে)। আপনার যদি বিশেষত ধীর ফাইল সিস্টেম না থাকে (তবে এনএফএস, সাম্বা বা অন্যান্য নেটওয়ার্ক ফাইল সিস্টেম, বা সাইগউইন) না থাকলে মন্দাটি খুব কমই উপলব্ধিযোগ্য।

আপনার $PATHদৃষ্টিভঙ্গি পর্যালোচনা করার সময় নকল এন্ট্রিগুলিও কিছুটা বিরক্তিকর হয় , আপনাকে আরও ক্রাফ্টের মধ্য দিয়ে যেতে হয়।

সদৃশ এন্ট্রিগুলি এড়াতে এটি যথেষ্ট সহজ।

case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac

পার্শ্ব দ্রষ্টব্য: অন্য কারও শেল স্ক্রিপ্টটি উত্সাহিত করার অর্থ তার লেখা কোডটি কার্যকর করা। অন্য কথায়, আপনি যখনই চান আপনার বন্ধুদের আপনার অ্যাকাউন্টে অ্যাক্সেস দিচ্ছেন।

পার্শ্ব নোট: .bashrcসেট করার সঠিক জায়গা $PATHবা অন্য কোনও পরিবেশের পরিবর্তনশীল নয়। পরিবেশের ভেরিয়েবলগুলি সেট করা উচিত ~/.profile। দেখুন ব্যাশ সহ পরিবেশের ভেরিয়েবল স্থাপনের জন্য কোন সেটআপ ফাইলগুলি ব্যবহার করা উচিত? , .Bashrc এবং .bash_profile মধ্যে পার্থক্য


8
+1: "আপনার বন্ধুদের আপনার অ্যাকাউন্টে অ্যাক্সেস দেওয়ার জন্য" যথেষ্ট জোর দেওয়া যায় না। এমনকি যদি আপনার ক্ষতি করার চেষ্টা নাও করা হয় তবে তাদের স্ক্রিপ্টটি কেবল তাদের প্রয়োজন মতো হতে পারে এবং আপনি যখন এটি উত্স তৈরি করেন তখনও আপনার মধ্যাহ্নভোজ খান।
এমএসডব্লু

এই সমাধানের একটি সম্ভাব্য সমস্যা হ'ল যদি AT new_entry ইতিমধ্যে PATH- এ প্রথম এন্ট্রি হয় তবে ": $ new_entry:" মেলে না। প্রাথমিক ':' কোলন বাদ দিয়ে আমি আমার প্রোফাইলে এটি স্থির করেছি।
জেফ বাউয়ার

@ জেফবাউর আমি সমস্যাটি দেখতে পাচ্ছি না। আমি ব্যবহার করি case :$PATH:এবং case $PATHএমনটি হয় না যাতে এটি প্রথম বা শেষ এন্ট্রি থাকলেও এটি মেলে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

31

আমি লোকদের তাদের প্যাথ ভেরিয়েবল থেকে নকলগুলি ব্যবহার করে awkএবং এর মতো কিছু পরিষ্কার করতে দেখেছি :

PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')

আপনি এটি নিজের বাশার্কে যোগ করার চেষ্টা করতে পারেন এবং এটি চালানোর আগে আপনি অন্য ফাইলগুলি উত্সস্থ করেছেন তা নিশ্চিত করতে পারেন।

একটি বিকল্প ব্যবহার করতে হবে ইউটিলিটি।pathmerge

আপনার গতির সমস্যা হিসাবে, এটি কোনও গুরুত্বপূর্ণ উপায়ে শেলের প্রারম্ভকালীন সময়কে প্রভাবিত করবে না তবে এটি কমান্ডগুলির জন্য ট্যাব সমাপ্তি করতে কিছুটা সময় সাশ্রয় করতে পারে, বিশেষত যখন কমান্ডটি পাথটিতে পাওয়া যায় না এবং এটি একই বার বার অনুসন্ধান করে does ফোল্ডার এটি খুঁজছেন।

নিরাপত্তা একটি নোট: আপনি উচিত সত্যিই মনোযোগ গিলেজ 'সতর্কবার্তা নিরাপত্তা সম্পর্কে এখানে। অন্য ব্যবহারকারীর মালিকানাধীন কোনও ফাইল সোর্স করে আপনি প্রতিবার শেল শুরুর সময় সেই ব্যবহারকারীদের নিজের ব্যবহারকারী হিসাবে তাদের নিজস্ব কোড চালানোর জন্য একটি বিনামূল্যে পাস দিচ্ছেন giving আপনি যদি আপনার পাসওয়ার্ড সহ সেই ব্যবহারকারীদের বিশ্বাস না করেন তবে আপনার তাদের শেল ফাইলগুলি স্যুরসিং করা উচিত নয়।


6
আমি অ্যাজক ওয়ান-লাইনার পছন্দ করি তবে এটি একটি পিছনের ওআরএস ':' মুদ্রণ করে। তাই আমি এটি পড়তে পরিবর্তন করেছিPATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}')
gkb0986

অনুচ্ছেদটি :কেবল একটি প্রসাধনী বিষয় নয়। এটি .আপনার পথে যোগ করার মতোই , যা সম্ভাব্য বিপজ্জনক।
উইসবাকি

আমি gkb0986 থেকে সমাধানটি অন্তর্ভুক্ত করার জন্য সম্পাদনা করেছি।
টিম লেশার

@ টিমলিশার উত্তরের পরিবর্তে আমি কখনও সম্পাদনা করার কারণটি হ'ল এটি আমার পক্ষে কাজ করে না .... এবং এটি ছাড়া আসলটি কাজ করে না (সহবর্তী বিচ্ছেদকারীকে না রেখে। আমি জানি না পার্থক্যটি কী ।
কালেব

1
@ gkb0986 এই সমাধানটি এখনও ব্যর্থ হয় যদি পথটিতে একটি পলাতক স্থান থাকে যেমন PATH = / বিন: / foo \ বার: / usr / বিন। আমি এমন একটি রূপ পেয়েছি যা এটি এড়ায় unix.stackexchange.com/a/124517/106102
maharvey67

13

@ গিলস উত্তরের উপর ভিত্তি করে আপনি টাইপিং হ্রাস করার জন্য এটি কোনও ফাংশনে আবদ্ধ করতে পারেন:

function addToPATH {
  case ":$PATH:" in
    *":$1:"*) :;; # already there
    *) PATH="$1:$PATH";; # or PATH="$PATH:$1"
  esac
}

addToPATH /Applications/AIRSDK_Compiler/bin
addToPATH ~/.local/lib/npm/bin

1
সর্বাধিক ব্যবহারিক-ব্যবহারযোগ্য (উচ্চ-স্তরের, সম্ভবত) উত্তর।
আইজোসেফ

3

কেবলমাত্র প্রথম ম্যাচটি $PATHকার্যকর করা হয়, সুতরাং পরবর্তী কোনও এন্ট্রি তার পরে প্রক্রিয়া করা হয় না। এজন্য $PATHআপনার পরিবেশটিকে আশানুরূপ আচরণ করতে আপনার মাঝে মাঝে প্রবেশের ক্রমটি সংশোধন করা উচিত ।

আপনার প্রশ্নের উত্তর দেওয়ার জন্য: এটি ধীর সূচনার কারণ হওয়া উচিত নয়।


1
তবে আমি কোনও কমান্ড টাইপ করি যখন বিদ্যমান নেই। কমান্ডের জন্য এটি একই ফোল্ডারটি দু'বার অনুসন্ধান করবে।
বালকি

@ বাল্কি আপনি বোঝাতে চাইছেন কমান্ড দিয়ে TAB? সেক্ষেত্রে আপনার সম্পূর্ণ সংজ্ঞাটি দেখতে ভাল লাগে না কিনা তা আপনার পরীক্ষা করা উচিত complete -c which -a। আপনার -aপ্যারামিটারটি মুছে ফেলা উচিত । আপনি না পরীক্ষা করতে যে কমান্ডটি জারি করে: complete | grep which
রাজিশ

এটি যদি একই ডিরেক্টরিটি অনুসন্ধান করার আগে এটি একাধিকবার হয় নি তবে এটি অনুসন্ধান করতে পারে।
র্যান্ডম 832

-1

আমার PATH- এ সদৃশ এন্ট্রিগুলি প্রতিরোধ করতে, আমাকে নীচে BOTH। / .Bash_profile এবং ~ / .bashrc লিখতে হয়েছিল:

PATH=$(echo $(sed 's/:/\n/g' <<< $PATH | sort | uniq) | sed -e 's/\s/':'/g')

মূল অসুবিধাটি হ'ল এটি পাঠের এন্ট্রিগুলিকে বাছাই করে তবে আমি মনে করি আমি এটি নিয়েই বেঁচে থাকতে পারি।


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