我经常修改我的.bashrc然后来源。 但是,当我在我的文件中export PATH="~/bin:~/perl5/bin:$PATH"
时,每次我input文件时, PATH
环境variables都会增长。
例如,第一次.bashrc源, PATH
variables由~/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。 另外要注意的是我执行以下操作
这是为了确保我可以处理带有空格的目录(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轮,不留下尾随: