PATH ভেরিয়েবল থেকে নকল এন্ট্রি ছাঁটাই


9

আমি আমার .bashrc ঘন ঘন সংশোধন করি এবং তারপরে উত্স উত্পন্ন করি। যাইহোক, যখন export PATH="~/bin:~/perl5/bin:$PATH"আমার ফাইলে জিনিসগুলি থাকে তখন PATHপ্রতিবার যখন ফাইলটি উত্স করা হয় তখন পরিবেশের পরিবর্তনশীল বৃদ্ধি পায়।

উদাহরণস্বরূপ, প্রথমবার .Bashrc উত্সাহিত হয়, PATHভেরিয়েবলটি থাকে ~/bin:~/perl5/bin:/usr/bin:/bin

দ্বিতীয়বার এটি গঠিত ~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin

তৃতীয়বার এটি গঠিত ~/bin:~/perl5/bin:~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin

এটি কেবল এমন কিছু যুক্ত করার সহজ উপায় আছে যা ইতিমধ্যে পাঠে নেই?

উত্তর:


12

বেশিরভাগ ডিস্ট্রোতে পাওয়া প্যাথমুনজ () ফাংশনটি ব্যবহার করুন /etc/profile:

pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
   if [ "$2" = "after" ] ; then
      PATH=$PATH:$1
   else
      PATH=$1:$PATH
   fi
fi
}

সম্পাদনা : zshব্যবহারকারীদের জন্য, typeset -U <variable_name>পাথ এন্ট্রিগুলি নকল করবে।


ধন্যবাদ! এটি /etc/profileডেবিয়ান লেনির মধ্যে নেই, তাই আমি এটি আমার মধ্যে অন্তর্ভুক্ত করি .bashrc
ক্রিস্টোফার বটমস

ব্যবহার: pathmunge /some/pathস্থাপন করবে /some/pathশুরুতে $PATHএবং pathmunge /some/path afterস্থাপন করবে /some/pathশেষে$PATH
ক্রিস্টোফার বটমস

আধুনিক বাশ শেলগুলিতে হিউ ডিরেক্টরিটি বর্তমান পথে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখার পরিষ্কার উপায় if ! [[ $PATH =~ (^|:)$1($|:) ]] ; then
ক্রিস্টোফার ক্যাসেল

আমি এটি ব্যবহার করব না। যদি আমার নির্বোধ সংস্করণটি বলে যে পাঠ = = foo: AT প্যাথ এর অর্থ আমি চাই / জিতে যেতে চাই। pathmunge /foo beforeএটি সম্পাদন করে না আরও ভাল উপায় হ'ল শুরুতে foo যোগ করা এবং তারপরে নকলগুলি সরিয়ে ফেলা।
ডন হ্যাচ

3

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

    tmppath=(${PATH// /@})
    array=(${tmppath//:/ })
    for i in "${array[@]//@/ }"
    do
        if ! [[ $PATH_NEW =~ "$i" ]]; then
            PATH_NEW="${PATH_NEW}$i:";
        fi
    done;
    PATH="${PATH_NEW%:}"
    export PATH
    unset PATH_NEW

আপনি সর্বদা এটি আরও কিছুটা অনুকূল করতে পারেন, তবে সঠিকভাবে ভেরিয়েবলগুলি সেট করা হচ্ছে কিনা তা নিশ্চিত হওয়ার জন্য আমার আসলটিতে অতিরিক্ত কোড ছিল display অন্যান্য বিষয় লক্ষণীয় যে আমি নিম্নলিখিতটি সম্পাদন করি

  1. @ অক্ষর দিয়ে যে কোনও স্পেস অক্ষর প্রতিস্থাপন করুন
  2. অ্যারে বিভক্ত করুন
  3. অ্যারে মাধ্যমে লুপ
  4. এলিমেন্ট স্ট্রিংয়ের কোনও @ অক্ষরকে একটি স্থান দিয়ে প্রতিস্থাপন করুন

এটি নিশ্চিত করার জন্য যে আমি ফাঁকা জায়গাগুলি দিয়ে ডিরেক্টরিগুলি পরিচালনা করতে পারি (সক্রিয় ডিরেক্টরি ব্যবহারকারীর সাথে সাম্বা হোম ডিরেক্টরিতে ফাঁকা স্থান থাকতে পারে!)


সতর্কতা: এই বাস্তবায়নে একটি বড় বাগ রয়েছে !! দুটি এন্ট্রি একই না থাকলেও রেজিএক্সপ্যাকের সাথে মেলে এমন /binঅন্যান্য এন্ট্রি থাকলে এটি সরিয়ে ফেলবে /usr/bin!
সুকিমা

এখানে একটি বিকল্প বাস্তবায়ন যে সংশোধন করা হয়েছে যে বাগ: github.com/sukima/dotfiles/blob/...
Sukima

1

আপনার পথ সুস্পষ্টভাবে সেট করুন।


ধন্যবাদ। আমি স্পষ্টভাবে পথটি সেট করার চেষ্টা করেছি, তবে আমার কাছে একটি .bashrc ফাইল রয়েছে যা আমি একাধিক পরিবেশে ব্যবহার করি, তাই সঠিক ডিফল্ট PATHসবসময় একই থাকে না।
ক্রিস্টোফার বটমস

1

কেবল একটি স্ট্রিং:

for i in $(echo $PATH|tr ":" "\n"|sort|uniq);do PATH_NEW="${PATH_NEW}$i:";done;PATH="${PATH_NEW%:}"

ধন্যবাদ। এটি মুশকিলের কারণ হতে পারে এটি হ'ল বর্ণানুক্রমিকভাবে (বা ASCIIbetically) এর বিষয়বস্তুগুলিকে পুনর্বিন্যাস করে $PATH। আমি $PATH(যেমন /home/username) এর শুরুতে সুনির্দিষ্ট ডিরেক্টরি স্থাপন করতে চাই যাতে আমার এক্সিকিউটেবলের ব্যক্তিগত কপিগুলি বিল্ট-ইন ডিফল্টগুলির পরিবর্তে চালিত হয়।
ক্রিস্টোফর বটমস

1

আপনি এটি সমাধান করতে পারে এমন দুটি ভিন্ন উপায় সম্পর্কে আমি ভাবতে পারি। প্রথমটি হ'ল আপনার .bashrcটিকে এমন একটি লাইন দিয়ে শুরু করা যা আপনার বেস PATH স্পষ্টভাবে নির্ধারণ করে, আপনি যখনই এটি উত্সটি উত্পন্ন করেন, অতিরিক্ত ডিরেক্টরি যুক্ত করার আগে এটি বেসে পুনরায় সেট করা হয়।

উদাহরণস্বরূপ, যুক্ত করুন:

# Reset the PATH to prevent duplication and to make sure that we include
# everything we want.
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

বিকল্পভাবে, আপনি কোনও আইটেমটি পথে যুক্ত করার আগে এটি পরীক্ষা করতে পারেন। এটি করতে আপনি কিছু ব্যবহার করতে চাই:

if ! [[ $PATH =~ '~/perl5/bin' ]]
then
    PATH="~/perl5/bin:$PATH"
fi

যদি আপনি প্রচুর এন্ট্রি যোগ করেন তবে পরবর্তীটি কিছুটা পুনরাবৃত্তি পেতে পারে তাই আমি প্রাক্তনটির সাথে লেগে থাকি। আপনি যদি এটি ব্যবহার করতে চান এবং প্রচুর এন্ট্রি যুক্ত করার পরিকল্পনা করেন, তবে এটি পরিচালনা করার জন্য একটি ব্যাশ ফাংশন লিখতে হবে বুদ্ধিমানের কাজ।

দ্রষ্টব্য: দ্বিতীয় বিকল্পটি কেবল আধুনিক সংস্করণ বাশে লিখিত হিসাবে কাজ করতে পারে। নিয়মিত এক্সপ্রেশন সমর্থন বোর্ন শেল (/ বিন / শ) বৈশিষ্ট্য নয় এবং অন্যান্য শেলগুলিতে এটির অস্তিত্ব থাকতে পারে। এছাড়াও, কোটের ব্যবহারের প্রয়োজন পড়তে পারে না বা বাশের কিছু নতুন সংস্করণেও সমস্যা তৈরি করতে পারে।


ধন্যবাদ। আমি স্পষ্টভাবে পথটি সেট করার চেষ্টা করেছি, তবে আমার কাছে একটি .bashrc ফাইল রয়েছে যা আমি একাধিক পরিবেশে ব্যবহার করি, তাই সঠিক ডিফল্ট PATHসবসময় একই থাকে না।
ক্রিস্টোফার বটমস

আপনার স্থানীয় হোস্টনেম কী তা দেখার জন্য এবং তারপরে সেই সার্ভারের জন্য আপনার পরম পথটি যথাযথভাবে সেট করে আপনি স্ক্রিপ্টটি পরীক্ষা করে এখনও এটি পরিচালনা করতে পারেন।
ক্রিস্টোফার ক্যাসেল

শুধু একটি টাইপো: দ্য! অনুপস্থিত if। এছাড়াও, আশ্চর্যজনকভাবে (আমার কাছে) এটিকে এমন একটি ফাংশন হিসাবে তৈরি করা সহজ যা স্পেস-বিচ্ছিন্ন যুক্তিগুলির চেয়ে লুপ করে, তাই আপনি কেবল এটি বলতে পারেন: add_to_PATH ~/perl5/bin ~/.bin unix.stackexchange.com/a/4973/28760 (আমার ধারণা অনুমান যে caseসেখানে ব্যবহৃত বিবৃতিটি আরও বহনযোগ্য) , তবে আপনার ifকাছে আমার কাছে আরও পরিষ্কার) অদ্ভুত কাকতালীয় সম্পাদনা করুন যে প্রশ্নটি perl5 যোগ করে!
13

@ 13ren: নোটের জন্য ধন্যবাদ। আমি ঠিক বুঝতে পেরেছি যে আমি প্যাথ সেট লাইনে একক উদ্ধৃতি ব্যবহার করেছি, আমার মতো ডাবল-কোটগুলির পরিবর্তে। যেমনটি লেখা আছে, এটি আপনার বিদ্যমান পথটি ভেরিয়েবল নামের সাথে প্রতিস্থাপন করে। ওহো! স্পষ্টতই এটি টাইপসের জন্য আমার পক্ষে খারাপ প্রবেশ ছিল; দু'জনেই এখন স্থির।
ক্রিস্টোফার ক্যাসেল

0

এখানে আমার সমাধান: PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")

একটি দুর্দান্ত সহজ একটি লাইনার যা কোনও পিছনে ছাড়বে না:

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