2012-07-25 144 views
90

我已經在$ PATH變量中定義了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 
+0

哪兒去定義它的6倍?在哪些文件? – hovanessyan 2012-07-25 14:06:12

+3

可能重複[在Bash中從$ PATH變量中刪除路徑的最優雅方式是什麼?](http://stackoverflow.com/questions/370047/what-is-the-most-elegant-way-to -remove-a-path-from-the-path-variable-in-bash) – 2014-10-17 12:30:32

回答

88

您只需要執行:

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

這將是當前會話中,如果你想改變永久將其添加到任何的.bashrc,bash.bashrc,/ etc/profile文件 - 無論符合您的系統和用戶需求。

+0

是的,我將它們永久地設置在bash.bashrc中。那麼命令應該是這樣的嗎? 'echo'export PATH = $ PATH:/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games'>>〜/ .bashrc ' – 2012-07-25 13:44:30

+0

的事情是,取決於你的操作系統的配置鏈執行。您需要確保PATH變量稍後不會被覆蓋。最簡單的方法(對於一個用戶)是將其覆蓋在用戶的個人.bashrc中,該用戶通常位於其主目錄中。 – hovanessyan 2012-07-25 13:46:05

+0

您的命令將PATH設置爲 - $ PATH(PATH的當前值)+字符串/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:的/ usr/GAM ES。如果你想只有字符串,請從命令中刪除$ PATH +分號(:)。手動使用echo或編輯文件〜/ .bashrc無關緊要。 – hovanessyan 2012-07-25 13:47:25

0

你怎麼這些重複的路徑添加到您的PATH變量?您必須編輯您的.文件之一。 (.tcshrc.bashrc等,具體取決於您的特定系統/外殼)。修復它的方法是再次編輯文件並刪除重複的路徑。

如果你沒有編輯任何文件,而你你必須已經交互地修改了PATH。在這種情況下,更改不會「粘住」,即如果您打開另一個shell,或者註銷並重新登錄,更改將自動消失。

請注意,也有一些系統配置文件,但它不太可能你修改這些,所以很可能你會改變你的個人主目錄中的文件(如果你想讓這些更改永久解決組路徑)

0

假設你的shell是bash,你可以設置路徑與

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

但像捷爾另一種回答說,只要你終止Shell的變化將會消失。您可能想要在~/.bash_profile~/.bashrc中設置您的PATH

0

沒有標準的工具來編輯$PATH的值(即「僅在文件夾不存在時才添加文件夾」或「刪除此文件夾」)。

要檢查下次登錄時的路徑,請使用telnet localhost(或telnet 127.0.0.1)。然後它會詢問您的用戶名和密碼。

這爲您提供了一個新的登錄shell(即一個不會從當前環境繼承任何東西的全新登錄shell)。

你可以檢查那裏的$PATH的值,並編輯你的rc文件,直到它是正確的。這對查看是否可以在對重要文件進行更改後再次登錄也很有用。

+0

只需鍵入'/ bin/bash -i',而不必輸入用戶名/密碼。更少麻煩。 – 2012-07-25 13:47:07

7

下面是一行代碼,清理PATH

  • 它不會干擾路徑的順序,只需刪除重複
  • 治療:使用和empth 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)}}')"; 
    
57

如果你正在使用bash,你也可以做,如果下面,讓我們說,你想從你的PATH變量刪除目錄/home/wrong/dir/

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

這對我很有用,因爲/ etc/profile中添加了一個目錄,我希望將其排除在外,但對/ etc沒有寫入權限。感謝:) – Samizdis 2014-04-23 15:42:42

+10

Protip:你可以在sed表達式中使用不同的deliminator來避免\/escaping:'PATH = $(echo $ PATH | sed -e's |:/ home/wrong/dir | $ ||') ' – iNecas 2014-12-11 21:30:27

+3

這個技巧有助於我想要立即擁有新的PATH,並且不想從當前終端註銷。但是,爲了避免混亂,在分配給PATH生成命令之前(例如'echo $ PATH | sed -e's /:\/home \/wrong \/dir \/$ //'')路徑。 – biocyberman 2015-05-01 08:38:32

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 2017-08-12 08:11:23

1

在bash你根本就$ {VAR /查找/替換}

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

還是在這種情況下(作爲替換位是空的)只是:

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

我來到這裏先,但去el因爲我認爲會有parameter expansion這樣做。比sed更容易!

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

+0

'%'表示匹配字符串結尾,'#'表示開頭。 – sabgenton 2015-06-10 14:35:04

1

爲便於複製粘貼模板,我用這個Perl的片段:

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

這樣,你不需要逃避替代運營商的斜線。

3

Linux的從頭開始有這個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