Gereksiz yolları $ PATH değişkeninden kaldırın


125

$ PATH değişkeninde aynı yolu 6 kez tanımladım.

Çalışıp çalışmadığını kontrol etmek için çıkış yapmıyordum.

Yinelenenleri nasıl kaldırabilirim?

$ PATH değişkeni şuna benzer:

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

Nasıl sıfırlarım

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

6 kez nerede tanımladın? hangi dosyalarda?
hovanessyan


Yanıtlar:


122

Siz sadece çalıştırın:

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

kalıcı olarak değiştirmek istiyorsanız, sisteminize ve kullanıcı ihtiyaçlarınıza uyan herhangi bir .bashrc, bash.bashrc, / etc / profile ekleyin.

Not: Bu, Linux içindir. Bunu yeni kodlayıcılar için netleştireceğiz. (`, ') SET = bunları denemeyin.


evet, onları bash.bashrc'de kalıcı olarak ayarladım. Öyleyse komut böyle bir şey olmalı mı? echo 'export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' >> ~/.bashrc
charles hendry

mesele şu ki, işletim sisteminize bağlı olarak bir yapılandırma zinciri yürütülür. Daha sonra PATH değişkeninin üzerine yazılmadığından emin olmanız gerekir. Bunu yapmanın en kolay yolu (bir kullanıcı için), genellikle kendi ana dizininde bulunan kullanıcının kişisel .bashrc dosyasında bunun üzerine yazmaktır.
hovanessyan

1
komutunuz PATH'ı - $ PATH (PATH'nin geçerli değeri) + dizesi / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / olarak ayarlar usr / gam es. Yalnızca String'e sahip olmak istiyorsanız, komutunuzdan $ PATH + noktalı virgülü (:) kaldırın. Echo kullanmanız veya ~ / .bashrc dosyasını elle düzenlemeniz fark etmez.
hovanessyan

bash.bashrc dosyası / etc klasöründe bulunur. Yine de $ PATH değişkenini göstermiyor, bu yüzden onu nerede düzenleyeceğimi bilmiyorum
charles hendry

ilk yorumunuzda /etc/bash.bashrc'ye değil ~ / .bashrc'ye (alıntı: >> ~ / .bashrc) yankılanırsınız. Belirli bir kullanıcı için PATH'i değiştirmek isterseniz, bunu / home / <kullanıcının adı> /. Bashrc dosyasında düzenleyin. /etc/bash.bashrc tüm kullanıcılar için geçerlidir.
hovanessyan

70

Eğer Bash kullanıyorsanız, ayrıca Diyelim ki dizinini kaldırmak istediğiniz, diyelim, eğer aşağıdakileri yapabilirsiniz /home/wrong/dir/sizin gelen PATHdeğişken:

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

1
Bu benim için yararlı oldu, çünkü dışarıda bırakmak istediğim, ancak / etc / etc'ye yazma erişimim olmayan bir dizin / etc / profile eklendi. Teşekkürler :)
Samizdis

13
Protip: \ / kaçmasını önlemek için sed ifadesinde farklı sınırlayıcı kullanabilirsiniz:PATH=$(echo $PATH | sed -e 's|:/home/wrong/dir|$||')
iNecas

4
Bu numara, hemen yeni PATH'e sahip olmak istediğimde ve mevcut terminalden çıkmak istemediğimde yardımcı oluyor. Bununla birlikte, karışıklıktan kaçınmak için, PATH komutuna echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'atamadan önce PATH üreten komutu (yani ) denemek gerekir .
biocyberman

2
Silinecek yol 1. yol olduğunda bu işe yaramaz $PATH. Bu birini kullanınPATH=$(echo :$PATH: | sed -e 's,:/home/wrong/dir:,:,g' -e 's/^://' -e 's/:$//')
Robin Hsu

$ PATH=echo $ PATH çalışmadı | sed -e 's /: \ / scratch \ / sjn \ / anaconda \ / bin \ / python \ / $ //' `` kaldırmak için / scratch / sjn / anaconda / bin / python
Mona Jalal

13

Linux: $ PATH değişkeninden gereksiz yolları kaldırın

Sıfırdan Linux , / etc / profile içinde bu işleve sahiptir.

# 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"
}

Bunun, gereksiz yere yapmamanız için yola ekleme yapmak için bu işlevlerle kullanılması amaçlanmıştır:

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"
}

Basit kullanım, yalnızca pathremovekaldırılacak dizin yolunu vermektir - ancak bunun tam olarak eşleşmesi gerektiğini unutmayın:

$ pathremove /home/username/anaconda3/bin

Bu, o dizinin her bir örneğini yolunuzdan kaldıracaktır.

Dizini yolunuzda istiyorsanız, ancak fazlalıklar olmadan, diğer işlevlerden birini kullanabilirsiniz, örneğin - özel durumunuz için:

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

Ancak, endişe konusu okunabilirlik değilse, bu noktada şunları yapmanız daha iyi olur:

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

Yukarıdakiler, insanın bildiği tüm mermilerde çalışır mı?

Ben iş için yukarıdaki tahmin ediyorum sh, dashve bashen azından. Çalışmadığını öğrenmek beni şaşırtacak csh, fish', orksh`. Windows komut kabuğunda veya Powershell'de çalışacağından şüpheliyim.

Python'unuz varsa, aşağıdaki komut türü doğrudan sorulan şeyi yapmalıdır (yani, gereksiz yolları kaldırın):

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

Tek satırlık (çok satırlı sorunları önlemek için):

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

Yukarıdakiler daha sonra gereksiz yolları kaldırır. Daha önceki gereksiz yolları kaldırmak için, tersine çevrilmiş bir listenin dizinini kullanın ve yeniden tersine çevirin:

$ 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 gibi tüm kabuk çeşitlerinde çalışıyor mu? btw, RHEL'deki / etc / profilimde partremove () yok, sadece pathmunge () var.
Tagar

1
@Tagar Diğer tüm kabuklarla uyumluluk konusunda hiçbir garanti vermiyorum. Kullandığınız kabuk üzerinde test etmenizi öneririm ve eğer kabuğunuz için çalışmazsa, yüklediyseniz Python'u kullanabilirsiniz - nasıl olduğunu açıklamak için cevaba biraz Python ekledim.
Aaron Hall

"3.5.3 Kabuk Parametre Genişletme" yi doğru okursam ${!PATHVARIABLE}, bir tür değişken yönlendirmedir, ancak burada nasıl çalıştığından emin değilim. Lütfen açıklar mısınız?
loxaxs

@loxaxs Bu, bu bash işlevlerindeki localyerleşik bir değişkenle bildirilen yerel bir değişkendir (yalnızca bir işlev içinde kullanılabilir) Başka sorularınız varsa, muhtemelen sitede yeni bir soru sormalısınız (ilk önce bunu sağlamak için aradıktan sonra) tam bir kopya oluşturmuyorsunuz ...).
Aaron Hall

Bu gerçekten ilginç bir cevap, yazdığınız için teşekkürler! Bununla birlikte, karışık bir PATH değişkenini temizlemenin orijinal sorusu zarif bir şekilde çözülmemiş gibi görünüyor (itiraf etmeliyim ki, o zaman bu işlevleri kullanırken, başlamak için karışık bir PATH ile sonuçlanmayacaktır).
Christian Herenz

9

İşte PATH'i temizleyen tek satırlık bir kod

  • PATH'nin sırasını bozmaz, sadece kopyaları kaldırır
  • Davranır: ve PATH'i zarif bir şekilde boşaltır
  • Özel karakter kullanılmadığı için çıkış gerektirmez
  • Kullanır, /bin/awkböylece PATH kesildiğinde bile çalışır

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

1
kimse test etti mi? güvenlidir?
Joe RR

2
Eğer awk kurmadıysanız, yolunuzu temizler, daha önce echo $ PATH ile yolunuzu bir txt dosyasına kopyalamanızı öneririm
Jose Pita

Benim için çalışmıyor ... awk yükledim, ancak bazı kopyalar kaldırılmadı.
Christian Herenz

3
  1. Sadece echo $PATH
  2. ayrıntıları bir metin düzenleyiciye kopyala
  3. istenmeyen girişleri kaldırın
  4. PATH= # pass new list of entries

2

Yinelenen yolları kaldırmak istiyorsanız, birden çok perl5 / bin yolu ile sorun yaşadığım için bir süre önce yazdığım bu komut dosyasını kullanıyorum:

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

Ve sonunda ~ /. Profilime koydum. Neredeyse sadece BASH kullandığım için başka mermilerde denemedim.


1
Çözüm için +1. Btw, yalnızca birbiri ardına listeye giriyorlarsa çoğaltma yollarını kaldırır. Bunu düzeltmek |uniqiçin |sort|uniqolarak değiştirebilirsiniz , ancak bu, arzu edilen bir yan etki olduğunu düşünmediğim yoldaki tüm dizinlerin sırasını değiştirecektir.
Tagar

1

Kabuğunuzun Bash olduğunu varsayarsak, yolu şununla ayarlayabilirsiniz:

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

ama Levon'un başka bir cevapta söylediği gibi, kabuğu bitirir bitirmez değişiklikler gitmiş olacak. Muhtemelen kurmak istiyorum PATHin ~/.bash_profileya ~/.bashrc.


1

Bash'de $ {var / find / replace} yapabilirsiniz

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

Veya bu durumda (değiştirme biti boş olduğu için) sadece:

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

Önce buraya geldim ama bir parametre genişlemesi olacağını düşündüğüm için başka bir yere gittim bunu yapmak . Sed'den daha kolay !.

Yer tutucu karakter veya değişkendeki kelimeyi Bash'teki başka bir değişkenin değeriyle nasıl değiştirebilirim?


%dizenin sonunda #, başlangıcı ise eşleştir anlamına gelir .
sabgenton

0

Değerini "düzenlemek" için standart araçlar yoktur. $PATH (yani, "yalnızca zaten mevcut olmadığında klasör ekle" veya "bu klasörü kaldır").

Bir dahaki sefere oturum açtığınızda yolun ne olacağını kontrol etmek için, telnet localhost(veyatelnet 127.0.0.1 ) . Daha sonra kullanıcı adınızı ve şifrenizi isteyecektir.

Bu size yeni bir giriş kabuğu verir (yani mevcut ortamdan hiçbir şey miras almayan tamamen yeni bir kabuk).

$PATHOranın değerini kontrol edebilir ve doğru olana kadar rc dosyalarınızı düzenleyebilirsiniz. Bu ayrıca, önemli bir dosyada değişiklik yaptıktan sonra tekrar oturum açıp açamayacağınızı görmek için de yararlıdır.


Kullanıcı adını / şifreyi yazmak zorunda kalmak yerine, sadece yazın /bin/bash -i. Çok daha az güçlük.
Ed Heal

0

Bu yinelenen yolları PATH değişkeninize nasıl eklediniz? .Dosyalarınızdan birini düzenlemiş olmalısınız . ( .tcshrcveya.bashrc , vb. sisteminize / kabuğunuza bağlı olarak). Düzeltmenin yolu, dosyayı yeniden düzenlemek ve yinelenen yolları kaldırmaktır.

Eğer varsa vermedi herhangi dosyaları düzenlemek ve etkileşimli PATH modifiye olmalı. Bu durumda değişiklikler "kalıcı" olmayacak, yani başka bir kabuk açarsanız veya oturumu kapatıp tekrar oturum açarsanız, değişiklikler otomatik olarak gider.

Bazı sistem çapında yapılandırma dosyaları da olduğunu unutmayın, ancak bunları büyük olasılıkla değiştirmişsinizdir, bu nedenle büyük olasılıkla kişisel ana dizininizdeki dosyaları değiştireceksiniz (bir dizi yola yerleştikten sonra bu değişiklikleri kalıcı yapmak istiyorsanız)


0

Kolay bir kopyala-yapıştır şablonu için bu Perl pasajını kullanıyorum:

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

Bu şekilde, yedek operatör için eğik çizgilerden kaçmanıza gerek kalmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.