$ PATH ভেরিয়েবল থেকে অপ্রয়োজনীয় পাথগুলি সরান


125

আমি একই পথটি $ PATH ভেরিয়েবলটিতে 6 বার সংজ্ঞায়িত করেছি।

এটি কাজ করে কিনা তা পরীক্ষা করতে আমি লগ আউট করছিলাম না।

আমি কীভাবে নকলগুলি সরাতে পারি?

AT PATH ভেরিয়েবলটি দেখতে এরকম দেখাচ্ছে:

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin

আমি কীভাবে এটিটিকে পুনরায় সেট করব

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

আপনি এটি 6 বার সংজ্ঞা দিয়েছেন কোথায়? কোন ফাইলগুলিতে?
hovanessyan


উত্তর:


122

আপনি কেবল কার্যকর:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

এটি বর্তমান অধিবেশনটির জন্য, যদি আপনি স্থায়ীভাবে পরিবর্তন করতে চান তবে এটি কোনও .bashrc, bash.bashrc, / etc / প্রোফাইলে যুক্ত করুন - আপনার সিস্টেম এবং ব্যবহারকারীর প্রয়োজন অনুসারে যা কিছু ফিট করে।

দ্রষ্টব্য: এটি লিনাক্সের জন্য। আমরা নতুন কোডারদের জন্য এটি পরিষ্কার করব। (`, ') এগুলি = সেট করার চেষ্টা করবেন না।


হ্যাঁ, আমি এগুলি স্থায়ীভাবে bash.bashrc এ সেট করেছি। তাহলে কমান্ডের কিছু হওয়া উচিত? echo 'export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' >> ~/.bashrc
চার্লস হেন্ড্রি

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

1
আপনার কমান্ড প্যাথকে সেট করে - AT প্যাথ (প্যাথের বর্তমান মান) + স্ট্রিং / ইউএসআর / লোকাল / এসবিন: / ইউএসআর / লোকাল / বিন: / ইউএসআর / এসবিন: / ইউএসআর / বিন: / এসবিন: / বিন: / usr ডিরেক্টরির / গ্যাম স্প্যানিশ ভাষায়। আপনি যদি কেবল স্ট্রিং রাখতে চান তবে আপনার কমান্ড থেকে $ PATH + অর্ধিকোলন (:) সরিয়ে দিন। আপনি যদি ইকো ব্যবহার করেন বা ফাইলটি hand / .bashrc হাতে হাতে সম্পাদনা করেন তবে কিছু যায় আসে না।
hovanessyan

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

আপনার প্রথম মন্তব্যে আপনি et / .Bashrc (উদ্ধৃত: >> ~ / .bashrc) এর প্রতিধ্বনি করুন, /etc/bash.bashrc- এ নয়। আপনি যদি কোনও নির্দিষ্ট ব্যবহারকারীর জন্য PATH পরিবর্তন করতে চান তবে এটি / home / <ব্যবহারকারীর নাম> বাশার্ক ফাইলটিতে সম্পাদনা করুন। /etc/bash.bashrc সমস্ত ব্যবহারকারীর জন্য প্রযোজ্য।
hovanessyan

70

আপনি যদি ব্যাশ ব্যবহার করে থাকেন তবে আপনি নিম্নলিখিতগুলিও করতে পারেন যদি বলি যে, আপনি /home/wrong/dir/আপনার PATHভেরিয়েবল থেকে ডিরেক্টরিটি সরাতে চান :

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`

1
এটি আমার পক্ষে কার্যকর ছিল, যেহেতু / ইত্যাদি / প্রোফাইলে একটি ডিরেক্টরি যুক্ত করা হয়েছিল যা আমি বাদ দিতে চাই, তবে / ইত্যাদিতে লেখার অ্যাক্সেস নেই। ধন্যবাদ :)
সামিজদিস

13
প্রতিবাদ: আপনি \ / পলায়ন এড়ানোর জন্য সেড এক্সপ্রেশনটিতে বিভিন্ন ডিলিমিনেটর ব্যবহার করতে পারেন:PATH=$(echo $PATH | sed -e 's|:/home/wrong/dir|$||')
আইনেকাস

4
এই কৌশলটি তখনই সহায়তা করে যখন আমি এখনই নতুন পাথ চাই এবং বর্তমান টার্মিনাল থেকে লগ আউট করতে চাই না। যাইহোক, বিশৃঙ্খলা এড়ানোর জন্য, একজনকে PATH echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'নির্ধারণের আগে PATH জেনারেটিং কমান্ড (যেমন ) দিয়ে পরীক্ষা করা উচিত ।
বায়োসাইবারম্যান

2
মোছার পথটি যখন প্রথম পাথ হয়ে যায় তখন এটি কাজ করবে না $PATH। এটি ব্যবহার করুন:PATH=$(echo :$PATH: | sed -e 's,:/home/wrong/dir:,:,g' -e 's/^://' -e 's/:$//')
রবিন শুু

$ PATH=প্রতিধ্বনি didn't PATH | কাজ করেন নি sed -e 's /: \ / scratch \ / sjn \ / anaconda \ / bin \ / পাইথন \ / $ //' `` অপসারণ / স্ক্র্যাচ / sjn / anaconda / বিন / পাইথন
মোনা জালাল

13

লিনাক্স: $ PATH ভেরিয়েবল থেকে অপ্রয়োজনীয় পাথগুলি সরান

লিনাক্স থেকে স্ক্র্যাচের / ইত্যাদি / প্রোফাইলে এই ফাংশন রয়েছে

# Functions to help us manage paths.  Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
        local IFS=':'
        local NEWPATH
        local DIR
        local PATHVARIABLE=${2:-PATH}
        for DIR in ${!PATHVARIABLE} ; do
                if [ "$DIR" != "$1" ] ; then
                  NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
                fi
        done
        export $PATHVARIABLE="$NEWPATH"
}

পথটিতে যুক্ত করার জন্য এটি এই ক্রিয়াকলাপগুলির সাথে ব্যবহারের উদ্দেশ্যে, যাতে আপনি এটি অপ্রয়োজনীয়ভাবে না করেন:

pathprepend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

সরল ব্যবহার হ'ল pathremoveসরিয়ে দেওয়ার জন্য কেবল ডিরেক্টরি পাথ দেওয়া - তবে মনে রাখবেন যে এটির সাথে ঠিক মিল থাকতে হবে:

$ pathremove /home/username/anaconda3/bin

এটি আপনার ডিরেক্টরি থেকে ডিরেক্টরিটির প্রতিটি উদাহরণ সরিয়ে ফেলবে।

আপনি যদি আপনার পথে ডিরেক্টরিটি চান তবে অপ্রয়োজনীয় ছাড়াই আপনি কেবলমাত্র অন্য একটি ফাংশন ব্যবহার করতে পারেন, যেমন - আপনার নির্দিষ্ট ক্ষেত্রে:

$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games

তবে, যদি না পঠনযোগ্যতা উদ্বেগ না হয় তবে এই মুহুর্তে আপনি কেবল করণ করা থেকে ভাল:

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

উপরের কাজটি মানুষের জানা সমস্ত শেলগুলিতে কাজ করবে?

আমি কাজ করতে করতে উপরে অনুমান হবে sh, dashএবং bashঅন্তত। আমি এতে অবাক হব যে এটি কাজ করে না csh,fish', or তাই। আমি সন্দেহ করি এটি উইন্ডোজ কমান্ড শেল বা পাওয়ারশেল-এ কাজ করবে।

যদি আপনার পাইথন থাকে তবে নিম্নলিখিত ধরণের কমান্ডটি সরাসরি জিজ্ঞাসা করা উচিত (যা অপ্রয়োজনীয় পথ সরিয়ে ফেলুন):

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )

একটি ওয়ান-লাইনার (মাল্টলাইন ইস্যুগুলির পক্ষে)

$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )

উপরেরগুলি পরে অপ্রয়োজনীয় পথগুলি সরিয়ে দেয়। পূর্ববর্তী অপ্রয়োজনীয় পাথগুলি সরাতে, বিপরীত তালিকার সূচকটি ব্যবহার করুন এবং এটিকে আবার বিপরীত করুন:

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )

+1 টি। প্যাথ্রোমোভ () কি সমস্ত শেল স্বাদে কাজ করে, যেমন, সিএসএস, কেএসএস, বাশ ইত্যাদি? বিটিডাব্লু, আরএইচইএলে আমার / ইত্যাদি / প্রোফাইলে পার্ট্রেমোভ () নেই, তবে কেবলমাত্র প্যাথুনিজ () রয়েছে।
তাগর

1
@ টাগর আমি অন্য সমস্ত শেলের সাথে সামঞ্জস্যতা সম্পর্কে কোনও গ্যারান্টি দিচ্ছি না। আপনি যা শেল ব্যবহার করছেন তা পরীক্ষা করার পরামর্শ দিচ্ছি এবং এটি যদি আপনার শেলের জন্য কাজ না করে তবে আপনি যদি এটি ইনস্টল করে থাকেন তবে আপনি পাইথন ব্যবহার করতে পারেন - কীভাবে তা বর্ণনা করার জন্য আমি উত্তরে কিছু পাইথন যুক্ত করেছি।
অ্যারন হল

আমি যদি "3.5.3 শেল প্যারামিটার এক্সপেনশন "টি সঠিকভাবে পড়ি তবে ${!PATHVARIABLE}এটি এক ধরণের পরিবর্তনশীল দিকনির্দেশনা, তবে এটি এখানে কীভাবে কাজ করে তা আমি নিশ্চিত নই। আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন?
লাক্স্যাক্সস 13

@ লাক্স্যাক্সস এই বিল্ড ফাংশনগুলিতে একটি স্থানীয় পরিবর্তনশীল, এটি বিল্টিন দিয়ে ঘোষণা করা হয়েছে local(যা কেবলমাত্র কোনও ফাংশনের অভ্যন্তরে ব্যবহার করা যেতে পারে)) আপনার যদি আরও প্রশ্ন থাকে তবে আপনার সম্ভবত সাইটটিতে একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত (নিশ্চিত হওয়ার জন্য প্রথমে এটি অনুসন্ধান করার পরে) আপনি সঠিক সদৃশ তৈরি করছেন না ...)।
অ্যারন হল

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

9

এখানে একটি লাইন কোড যা PATH পরিষ্কার করে

  • এটি PATH এর ক্রমকে বিরক্ত করে না, কেবল নকলগুলি সরিয়ে দেয়
  • চিকিত্সা: এবং PATH করুণার সাথে খালি
  • কোনও বিশেষ অক্ষর ব্যবহৃত হয় না, তাই পালানোর প্রয়োজন হয় না
  • ব্যবহার করে /bin/awkতাই এটি পাঠাও ভেঙে গেলেও কাজ করে

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
    printf(((NR==1)?"":":")$0)}}')";

1
এটা কেউ পরীক্ষা করেছে? নিরাপদ?
জো আরআর

2
যদি আপনি জাজ ইনস্টল না করে থাকেন তবে এটি আপনার পথ পরিষ্কার করে দেয়, আমি প্রতিধ্বনি দিয়ে আপনার টেক্সট ফাইলটিতে অনুলিপি করার পরামর্শ দিচ্ছি $
জোসে পিটা

আমার জন্য কাজ করে না ... আমি awk ইনস্টল করেছি, তবে কিছু সদৃশ সরানো হয়নি।
খ্রিস্টান হেরেনজ

3
  1. মাত্র echo $PATH
  2. একটি পাঠ্য সম্পাদক এ বিশদ অনুলিপি
  3. অবাঞ্ছিত এন্ট্রিগুলি সরান
  4. PATH= # pass new list of entries

2

আপনি যদি কেবল কোনও সদৃশ পথ সরাতে চান তবে আমি এই স্ক্রিপ্টটি ব্যবহার করেছি যখন আমি একাধিক পার্ল 5 / বিন পাথ নিয়ে সমস্যায় পড়ছিলাম তখন থেকে:

#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current shell gets the changes.

pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`

# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
    if test -d $dir ; then
        if test -z $PATH; then
            PATH=$dir
        else
            PATH=$PATH:$dir
        fi
    fi
done
export PATH
# echo "After loop, PATH: $PATH"

এবং আমি এটিকে আমার। /। প্রোফাইলে শেষে রেখেছি। যেহেতু আমি BASH প্রায় একচেটিয়াভাবে ব্যবহার করি, তাই আমি অন্যান্য শেলগুলিতে চেষ্টা করে দেখিনি।


1
সমাধানের জন্য +1। বিটিডব্লিউ, এটি কেবলমাত্র নকলের পথগুলি সরিয়ে ফেলবে যদি তারা একের পর এক তালিকায় থাকে। এটি ঠিক |uniqকরার |sort|uniqজন্য আপনি পরিবর্তন করতে পারেন, তবে এটি সেই পথে সমস্ত ডিরেক্টরিগুলির ক্রম পরিবর্তন করবে যা আমি মনে করি না যে এটি পছন্দসই পার্শ্ব-প্রতিক্রিয়া।
তাগর

1

আপনার শেলটি বাশকে ধরে নিলে আপনি এর সাথে পথ নির্ধারণ করতে পারেন

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

তবে লেভন অন্য উত্তরে বলেছিলেন, আপনি শেলটি শেষ করার সাথে সাথে পরিবর্তনগুলি চলে যাবে। আপনি সম্ভবত আপনার PATHমধ্যে ~/.bash_profileবা সেট আপ করতে চান ~/.bashrc


1

ব্যাশে আপনি কেবল $ {var / সন্ধান / প্রতিস্থাপন করতে পারেন can

PATH=${PATH/%:\/home\/wrong\/dir\//}

অথবা এই ক্ষেত্রে (প্রতিস্থাপন বিটটি খালি থাকায়) কেবল:

PATH=${PATH%:\/home\/wrong\/dir\/}

আমি প্রথমে এখানে এসেছি তবে প্যারামিটারের সম্প্রসারণ হবে বলে ভেবে আমি অন্য জিনিসপত্র রেখেছিলাম হবে। এর চেয়ে সহজ!

বাশে অন্য চলক থেকে মান সহ ভেরিয়েবলের স্থানধারক চরিত্র বা শব্দকে কীভাবে প্রতিস্থাপন করবেন?


%মানে স্ট্রিংয়ের শেষে যদি মিল থাকে তবে #এটি শুরুতে।
সাবজ্যানটন

0

এর মান "সম্পাদনা" করার জন্য কোনও মানক সরঞ্জাম নেই $PATH (যেমন "কেবলমাত্র ফোল্ডার যুক্ত করুন যখন এটি ইতিমধ্যে উপস্থিত নেই" বা "এই ফোল্ডারটি সরান")।

আপনি পরের বার লগইন করার সময় পাথটি কী হবে তা পরীক্ষা করতে, ব্যবহার করুন telnet localhost (বা )telnet 127.0.0.1 ) । এটি তখন আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড চাইবে।

এটি আপনাকে একটি নতুন লগইন শেল দেয় (যেমন একটি সম্পূর্ণ নতুন যা বর্তমান পরিবেশ থেকে কোনও কিছুর উত্তরাধিকারী নয়)।

আপনি সেখানকার মানটি পরীক্ষা করতে পারেন $PATHএবং আপনার আরসি ফাইলগুলি ঠিক না হওয়া পর্যন্ত সম্পাদনা করতে পারেন। এটি একটি গুরুত্বপূর্ণ ফাইলে পরিবর্তন করার পরে আপনি আবার লগইন করতে পারবেন কিনা তাও দরকারী।


ব্যবহারকারীর নাম / পাসওয়ার্ড টাইপ না করে কেবল টাইপ করুন /bin/bash -i। অনেক কম ঝামেলা।
এড হিল

0

কীভাবে আপনি আপনার পাঠ্য ভেরিয়েবলটিতে এই সদৃশ পথ জুড়লেন? আপনি অবশ্যই আপনার একটি .ফাইল সম্পাদনা করেছেন । ( .tcshrc, বা.bashrc , ইত্যাদি আপনার নির্দিষ্ট সিস্টেম / শেলের উপর নির্ভর করে)। এটি ঠিক করার উপায় হ'ল ফাইলটি আবার সম্পাদনা করা এবং সদৃশ পথগুলি সরিয়ে ফেলা।

আপনি যদি কোনও ফাইল সম্পাদনা না করে থাকেন এবং অবশ্যই আপনাকে অবশ্যই PATH ইন্টারেক্টিভ পরিবর্তন করতে হবে। সেক্ষেত্রে পরিবর্তনগুলি "স্টিক" হবে না, অর্থাত্ যদি আপনি অন্য শেলটি খুলেন, বা লগ আউট করে আবার লগ ইন করেন, পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে চলে যাবে।

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


0

একটি অনুলিপি-অনুলিপি টেম্পলেট জন্য আমি এই পার্ল স্নিপেট ব্যবহার:

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`

এইভাবে বিকল্প অপারেটরের জন্য আপনার স্ল্যাশগুলি এড়াতে হবে না।

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