$ पथ चर से अनावश्यक रास्ते निकालें


125

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

मैं जाँच नहीं कर रहा था कि यह काम कर रहा है या नहीं।

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

$ 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 बार कहां से परिभाषित किया है? कौन सी फाइलों में?
होवेनेसियन


जवाबों:


122

आप बस अमल करें:

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

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

नोट: यह लिनक्स के लिए है। हम नए कोडर्स के लिए इसे स्पष्ट करेंगे। (`, ') SET = ये कोशिश मत करो।


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

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

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

bash.bashrc फ़ाइल / etc फ़ोल्डर में स्थित है। हालांकि यह $ PATH वैरिएबल को प्रदर्शित नहीं करता है, इसलिए मुझे यकीन नहीं है कि इसे कहां संपादित किया जाए
charles hendry

अपनी पहली टिप्पणी में आप गूंज ~ / .bashrc (उद्धृत करते हुए: >> ~ / .bashrc), /etc/bash.bashrc पर नहीं। यदि आप किसी विशिष्ट उपयोगकर्ता के लिए PATH बदलना चाहते हैं तो उसे / home / <उपयोगकर्ता का नाम> / bashrc फ़ाइल में संपादित करें। /etc/bash.bashrc सभी उपयोगकर्ताओं पर लागू होता है।
होवेनेसियन

70

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

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

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

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

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

2
यह तब काम नहीं करेगा जब हटाए जाने वाले मार्ग में 1 पथ होना चाहिए $PATH। इस एक का उपयोग करें:PATH=$(echo :$PATH: | sed -e 's,:/home/wrong/dir:,:,g' -e 's/^://' -e 's/:$//')
रॉबिन ह्सु

काम नहीं किया $ PATH=गूंज $ PATH | sed -e 's /: \ / scratch \ / sjn \ / anaconda \ / bin \ / python \ / $ //' `को हटाने / खरोंच / sjn / anaconda / bin / python के लिए
मोना जलाल

13

लिनक्स: $ PATH चर से अनावश्यक रास्ते निकालें

लिनक्स स्क्रैच से इस समारोह में / etc / प्रोफाइल है

# 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', orksh`। मुझे संदेह है कि यह विंडोज कमांड शेल या पॉवर्सशेल में काम करेगा।

यदि आपके पास पायथन है, तो निम्न प्रकार के कमांड को वही करना चाहिए जो सीधे पूछा जाता है (यानी, अनावश्यक रास्ते हटा दें):

$ 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। pathremove () सभी शेल फ्लेवर में काम करता है, जैसे, csh, ksh, bash आदि? btw, आरएचईएल पर मेरे / etc / प्रोफाइल में partremove () नहीं है, लेकिन केवल pathmunge () है।
तगर

1
@ सागर मैं अन्य सभी गोले के साथ संगतता के बारे में कोई गारंटी नहीं देता हूं। मेरा सुझाव है कि आप जो भी खोल का उपयोग कर रहे हैं, उसका परीक्षण करें और यदि यह आपके शेल के लिए काम नहीं करता है, तो आप पायथन का उपयोग कर सकते हैं यदि आपने इसे स्थापित किया है - मैंने वर्णन करने के लिए उत्तर में कुछ पायथन जोड़ा।
हारून हॉल

अगर मैं "3.5.3 शैल पैरामीटर विस्तार" को सही ढंग से पढ़ता हूं, ${!PATHVARIABLE}तो एक प्रकार का चर अप्रत्यक्ष है, लेकिन मुझे यकीन नहीं है कि यह यहां कैसे काम करता है। क्या आप इसे समझा सकते हैं?
लक्साक्स

@loxaxs उन बैश फ़ंक्शंस में एक स्थानीय वैरिएबल है, जो बिलिन के साथ घोषित किया गया है local(जिसका उपयोग केवल किसी फ़ंक्शन के अंदर किया जा सकता है।) यदि आपके पास और प्रश्न हैं, तो आपको साइट पर एक नया प्रश्न पूछना चाहिए (यह सुनिश्चित करने के लिए पहले खोज करने के बाद) आप एक सटीक डुप्लिकेट नहीं बना रहे हैं ...)।
हारून हॉल

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

9

यहाँ एक लाइन कोड है जो 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 स्थापित नहीं है, तो यह आपके रास्ते को साफ करता है, मैं आपके पथ को txt फ़ाइल में कॉपी करने की सलाह देता हूं, इससे पहले कि $ $ PATH
जोस Pita

मेरे लिए काम नहीं करता है ... मैं awk स्थापित किया है, लेकिन कुछ डुप्लिकेट हटाए नहीं हैं।
क्रिश्चियन हरेंज़

3
  1. केवल echo $PATH
  2. एक पाठ संपादक में विवरण कॉपी करें
  3. अवांछित प्रविष्टियाँ निकालें
  4. PATH= # pass new list of entries

2

यदि आप किसी डुप्लिकेट पथ को निकालना चाहते हैं, तो मैं इस स्क्रिप्ट का उपयोग करता हूं जिसे मैंने कुछ समय पहले लिखा था क्योंकि मुझे कई perl5 / बिन रास्तों से परेशानी हो रही थी:

#!/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"

और मैंने इसे अंत में अपने ~ / .profile में डाल दिया। चूंकि मैं लगभग विशेष रूप से BASH का उपयोग करता हूं, इसलिए मैंने इसे अन्य गोले में आज़माया नहीं है।


1
समाधान के लिए +1। Btw, यह केवल दोहराव पथ को हटा देगा यदि वे एक के बाद एक सूची में जा रहे हैं। आप इसे ठीक |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 / find / प्रतिस्थापित कर सकते हैं}

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

या इस मामले में (के रूप में बिट खाली है) बस:

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

मैं यहां पहले आया था, लेकिन अन्य वेयरहाउस गया क्योंकि मुझे लगा कि ऐसा करने के लिए एक पैरामीटर विस्तार होगा। Sed की तुलना में आसान!।

बैश में दूसरे वेरिएबल से वैल्यू के साथ प्लेसहोल्डर कैरेक्टर या वर्ड को वेरिएबल में कैसे बदलें?


%मतलब मैच अगर स्ट्रिंग के अंत में है, #तो शुरुआत के लिए है।
सबजेनटन

0

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

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

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

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


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

0

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

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

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


0

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.