修剪PATHvariables中的重复条目

我经常修改我的.bashrc然后来源。 但是,当我在我的文件中export PATH="~/bin:~/perl5/bin:$PATH"时,每次我input文件时, PATH环境variables都会增长。

例如,第一次.bashrc源, PATHvariables由~/bin:~/perl5/bin:/usr/bin:/bin

第二次它由~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin

第三次由~/bin:~/perl5/bin:~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin

有没有一种简单的方法,使其只添加任何不在PATH中的东西?

使用大多数发行版的/etc/profile提供的pathmunge()函数:

 pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi fi } 

编辑 :对于zsh用户, typeset -U <variable_name>将删除重复path条目。

我有这个问题,所以我用StackOverflow问题上列出的技术的组合。 以下是我用来重复删除已经设置的实际PATHvariables,因为我不想修改基本脚本。

  tmppath=(${PATH// /@}) array=(${tmppath//:/ }) for i in "${array[@]//@/ }" do if ! [[ $PATH_NEW =~ "$i" ]]; then PATH_NEW="${PATH_NEW}$i:"; fi done; PATH="${PATH_NEW%:}" export PATH unset PATH_NEW 

你总是可以优化这一点,但我原来有额外的代码来显示发生了什么事情,以确保它正确地设置variables。 另外要注意的是我执行以下操作

  1. 用@字符replace任何SPACE字符
  2. 拆分数组
  3. 遍历数组
  4. 用空格replace元素string中的任何@字符

这是为了确保我可以处理带有空格的目录(Samba主目录中的Active Directory用户名可以有空格!)

明确设定你的path。

只有一个string:

 for i in $(echo $PATH|tr ":" "\n"|sort|uniq);do PATH_NEW="${PATH_NEW}$i:";done;PATH="${PATH_NEW%:}" 

我可以想到两种不同的方法可以解决这个问题。 第一个方法是用一个明确设置基本path的行来启动.bashrc,这样每次你发出它的时候,在添加额外的目录之前,它被重置为基础。

例如,添加:

 # Reset the PATH to prevent duplication and to make sure that we include # everything we want. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 

或者,您可以在将项目添加到path之前检查项目。 要做到这一点,你会使用像这样的东西:

 if ! [[ $PATH =~ '~/perl5/bin' ]] then PATH="~/perl5/bin:$PATH" fi 

后者往往会得到一些重复,如果你增加了很多条目,但是,所以我倾向于坚持前者。 如果你想使用这个,并计划添加很多条目,写一个bash函数来处理它是明智的。

注意:第二个选项可能只能用现代版本bash编写。 正则expression式支持不是Bourne Shell(/ bin / sh)function,可能不存在于其他shell中。 此外,引号的使用可能不需要,甚至可能导致一些最新版本的bash的问题。

这里是我的解决scheme: PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")

一个不错的简单的class轮,不留下尾随: