Linux:从$ PATHvariables中删除多余的path

我在$ PATHvariables中定义了相同的path6次。

我没有注销来检查它是否工作。

我怎样才能删除重复?

$ PATHvariables如下所示:

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 

你只需执行:

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

这将是当前会话,如果你想永久地将其添加到任何.bashrc,bash.bashrc,/ etc / profile – 任何符合你的系统和用户需求的。

如果你使用的是Bash,假如你想从PATHvariables中删除目录/home/wrong/dir/ ,你也可以执行以下操作:

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

如果您需要在脚本运行之前从PATHvariables中删除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 

这是一个清理PATH的单行代码

  • 它不会打扰PATH的顺序,只是删除重复
  • 对待:优雅地处理好PATH
  • 没有使用特殊字符,所以不需要转义
  • 使用/bin/awk所以即使在PATH被破坏的情况下也能正常工作

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

在bash中,你只需要$ {var / find / replace}

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

或者在这种情况下(因为replace位是空的)只是:

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

我来到这里,但去了其他的东西,因为我认为会有一个参数扩展来做到这一点。 比sed更容易!

如何用Bash中的另一个variables的值来replacevariables中的占位符字符或单词?

从头开始Linux 在/ etc / profile中有这个function

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

这是为了与这些function一起用于添加到path中,以便您不要冗余:

 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删除目录path – 但请记住,它必须完全匹配:

 $ pathremove /home/username/anaconda3/bin 

这将从您的path中删除该目录的每个实例。

如果你想要path中的目录,但没有冗余,你可以使用其他function之一,例如 – 对于你的具体情况:

 $ 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 

假设你的shell是Bash,你可以设置path

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

但就像Levon在另一个答案中所说的那样,只要你终止shell,变化就会消失。 你可能想要在~/.bash_profile~/.bashrc设置PATH

有没有标准的工具来“编辑” $PATH的价值(即“只有当文件夹不存在时添加文件夹”或“删除此文件夹”)。

要检查下次login时的path,请使用telnet localhost (或telnet 127.0.0.1 )。 然后它会询问您的用户名和密码。

这给你一个新的loginshell(即一个完全新的,不会从当前环境inheritance任何东西)。

您可以检查$PATH的值,并编辑您的rc文件,直到它是正确的。 在对一个重要的文件进行更改后,看看是否可以再次login也是有用的。

你如何将这些重复path添加到PATHvariables? 你必须编辑你的一个. 文件。 ( .tcshrc.bashrc等,取决于你的特定系统/ shell)。 修复它的方法是再次编辑文件并删除重复的path。

如果你没有编辑任何文件,而且你必须交互地修改PATH。 在这种情况下,更改不会“粘住”,即如果打开另一个shell,或者注销并重新login,更改将自动消失。

请注意,也有一些系统configuration文件,但是不太可能修改这些文件,所以很可能您将更改个人主目录中的文件(如果您希望一旦解决了一系列path问题,就将这些更改永久化)

对于一个简单的复制粘贴模板,我使用这个Perl代码片段:

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

这样你就不需要逃避替代操作符的斜线。