2012-07-25 18 views
90

मैं $ पथ चर 6 बार में एक ही पथ को परिभाषित किया है से बेमानी रास्तों निकालें।

मैं लॉग आउट जाँच करने के लिए है कि क्या यह काम नहीं कर रहा था।

मैं डुप्लिकेट कैसे निकाल सकते हैं?

$ पथ चर इस तरह दिखता है:

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 
+0

जहां आप इसे 6 बार परिभाषित किया है? किस फाइल में? – hovanessyan

+3

संभावित डुप्लिकेट [बैश में $ PATH चर से पथ को हटाने का सबसे शानदार तरीका क्या है?] (Http://stackoverflow.com/questions/370047/what-is-the-most-elegant-way-to -remove-a-path-from-the-path-variable-in-bash) –

उत्तर

88

तुम बस निष्पादित करें:

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

कि वर्तमान सत्र के लिए हो सकता है, आप स्थायी रूप से बदलने के लिए,/etc/प्रोफ़ाइल किसी भी .bashrc, bash.bashrc में जोड़ने के लिए चाहते हैं - जो कुछ भी आपके सिस्टम और उपयोगकर्ता की जरूरतों को फिट बैठता है।

+0

हाँ, मैंने उन्हें स्थायी रूप से bash.bashrc में सेट किया है। तो क्या आदेश इस तरह कुछ होना चाहिए? 'echo' निर्यात PATH = $ पथ:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games '>> ~/.bashrc ' –

+0

बात यह है कि आपके ओएस के आधार पर कॉन्फ़िगरेशन की एक श्रृंखला निष्पादित की जाती है। आपको यह सुनिश्चित करने की ज़रूरत है कि बाद में पैथ चर को ओवरराइट नहीं किया गया है। ऐसा करने का सबसे आसान तरीका (एक उपयोगकर्ता के लिए) इसे उपयोगकर्ता के व्यक्तिगत .bashrc में ओवरराइट करना है, जो आमतौर पर उसकी होम निर्देशिका में स्थित होता है। – hovanessyan

+0

आपका आदेश पैथ को - $ पाथ (पथ का वर्तमान मान) + स्ट्रिंग/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/गम तों। यदि आप केवल स्ट्रिंग रखना चाहते हैं, तो अपने आदेश से $ PATH + अर्धविराम (:) हटा दें। इससे कोई फर्क नहीं पड़ता कि आप इको का उपयोग करते हैं या फ़ाइल ~/.bashrc को हाथ से संपादित करते हैं। – hovanessyan

0

आप अपने पथ चर करने के लिए इन डुप्लिकेट पथ को जोड़ने था के लिए? आपने अपनी . फ़ाइलों में से एक संपादित करना होगा। (.tcshrc, या .bashrc, आदि आपके विशेष सिस्टम/खोल के आधार पर)। इसे ठीक करने का तरीका फ़ाइल को फिर से संपादित करना और डुप्लिकेट पथ को हटाना है।

यदि आप किसी भी फाइल को संपादित नहीं किया है, और आपने पीएटीएच को पारस्परिक रूप से संशोधित किया होगा। उस स्थिति में परिवर्तन "छड़ी" नहीं होंगे, यानी यदि आप एक और खोल खोलते हैं, या लॉग आउट करते हैं और वापस लॉग इन करते हैं, तो परिवर्तन स्वचालित रूप से चले जाएंगे।

ध्यान दें कि कुछ सिस्टम वाइड कॉन्फ़िगरेशन फ़ाइलें भी हैं, लेकिन यह संभावना है कि आपने उनको संशोधित किया है, इसलिए संभवतः आप अपनी व्यक्तिगत होम निर्देशिका में फ़ाइलों को बदल देंगे (यदि आप एक बार फिर से बदलना चाहते हैं तो आप उन परिवर्तनों को स्थायी बनाना चाहते हैं रास्तों का सेट)

0

अपने खोल मान लिया जाये कि बैश, आप

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

साथ पथ सेट कर सकते लेकिन लेवोन की तरह एक और जवाब में कहा, जैसे ही आप खोल परिवर्तन चला जाएगा समाप्त के रूप में है। आप शायद ~/.bash_profile या ~/.bashrc में अपने PATH स्थापित करना चाहते हैं।

0

$PATH के मान को "संपादित" करने के लिए कोई मानक उपकरण नहीं है (यानी "केवल फ़ोल्डर जोड़ें जब यह पहले से मौजूद नहीं है" या "इस फ़ोल्डर को हटाएं")।

यह जांचने के लिए कि अगली बार लॉगिन करते समय पथ क्या होगा, telnet localhost (या telnet 127.0.0.1) का उपयोग करें। फिर यह आपके उपयोगकर्ता नाम और पासवर्ड के लिए पूछेगा।

यह आपको एक नया प्रवेश खोल (अर्थात एक पूरी तरह से नया है कि मौजूदा माहौल से कुछ भी वारिस नहीं है) देता है।

आप $PATH का मूल्य की जाँच करें और अपने आर सी फ़ाइलों को संपादित जब तक यह सही है सकते हैं। यह भी उपयोगी है कि आप एक महत्वपूर्ण फ़ाइल में बदलाव करने के बाद फिर से लॉगिन कर सकते हैं या नहीं।

+0

उपयोगकर्ता नाम/पासवर्ड टाइप करने के बजाय, बस '/ bin/bash -i' टाइप करें। बहुत कम परेशानी –

7

यहाँ, एक एक लाइन कोड है कि पथ

  • यह पथ के आदेश को परेशान नहीं करता है को साफ है सिर्फ डुप्लिकेट
  • ट्रीट्स निकालता है: और empth पथ शान से
  • कोई विशेष वर्ण का इस्तेमाल किया है, तो बच
  • का उपयोग करता है /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)}}')"; 
    
57

आप बैश का उपयोग कर रहे हैं, तो आप भी अगर निम्न कर सकते हैं, मान लें कि अपने PATH चर से निर्देशिका /home/wrong/dir/ निकालना चाहते हैं,:

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

यह मेरे लिए उपयोगी था, क्योंकि निर्देशिका को/etc/प्रोफ़ाइल में जोड़ा गया था जिसे मैं बाहर करना चाहता था, लेकिन/etc के लिए कोई लेखन पहुंच नहीं है। धन्यवाद :) – Samizdis

+10

प्रोटिप: आप \/भागने से बचने के लिए sed अभिव्यक्ति में विभिन्न डिलीमिनेटर का उपयोग कर सकते हैं: 'PATH = $ (echo $ PATH | sed -e's |:/home/wrong/dir | $ ||') ' – iNecas

+3

यह चाल तब मदद करती है जब मैं तुरंत नया पाथ चाहता हूं, और वर्तमान टर्मिनल से लॉग आउट नहीं करना चाहता हूं। हालांकि, गड़बड़ से बचने के लिए, किसी को इसे पाथ जनरेटिंग कमांड (यानी 'echo $ PATH | sed -e's /: \/home \/wrong \/dir \/$ //' ') के साथ प्रयोग करने से पहले प्रयोग करना चाहिए पथ। – biocyberman

10

आप एक रास्ता निकालने की आवश्यकता है अपनी स्क्रिप्ट से पहले PATH चर से स्क्रिप्ट की शुरुआत में जोड़ना चलाता है:

PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;') 

आप की जरूरत है, तो आप इसके साथ सूची के सामने फिर से जोड़ सकते हैं:

PATH=/home/user/bin:$PATH 

या आप इसके साथ सूची के अंत में फिर से जोड़ सकते हैं:

PATH=$PATH:/home/user/bin 
+0

के लिए यह मेरे लिए काम करता है। – jessiPP

1

बैश में आप केवल $ कर सकते हैं {var/लगता है/बदलें}

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

या में इस मामले (जैसा कि प्रतिस्थापन बिट खाली है) बस:

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

मैं यहां पहले आया लेकिन एल जैसा कि मैंने सोचा था कि ऐसा करने के लिए parameter expansion होगा। Sed से आसान!

How to replace placeholder character or word in variable with value from another variable in Bash?

+0

'%' का अर्थ है स्ट्रिंग के अंत में मिलान, '#' शुरुआत के लिए है। – sabgenton

1

एक आसान कॉपी-पेस्ट टेम्पलेट मैं इस पर्ल का उपयोग करते हैं के लिए:

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

इस तरह आप स्थानापन्न ऑपरेटर के लिए स्लैश से बचने के लिए की जरूरत नहीं है।

3
खरोंच से

लिनक्स है इस function in /etc/profile

# 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