有没有合理的方法将新路径附加到bashrc中的PATH?

时间:2010-05-14 04:54:15

标签: linux bash path

我经常需要在.bashrc中为PATH环境变量添加新路径,如下所示: export PATH = / usr / local / bin:$ PATH 然后为了让它生效,我总是'source~ / .bashrc'或'。 〜/ .bashrc',虽然我发现这样做的一个缺点让我感到不舒服。

如果我继续这样做,PATH会越来越长,有许多重复的条目,例如在上一个命令中,如果我两次获取它,PATH的值将是 PATH = / usr / local / bin:/ usr / local / bin:/ usr / local / bin:$ PATH(< -the original path)。

是否有更好的方法在bashrc中将新路径附加到PATH而不会让它变得难看?

6 个答案:

答案 0 :(得分:2)

另一种方法是检查是否未设置OPATH。如果是,请将其设置为PATH。这将是你原来的路径。

if [ "$OPATH" == "" ];
then
    OPATH=$PATH
fi

PATH=~/bin:$OPATH

(代码未经测试......)

答案 1 :(得分:1)

如果您愿意接受shell的更改,zshdeclare -U用于此目的:它会自动从数组中删除重复项,同时保持优先级。它还允许您使用$path代替$PATH

% PATH=a:b:c:d:c:b:a
% echo $PATH
a:b:c:d:c:b:a
% declare -U PATH
% echo $PATH     

或者,为了提高可读性,您可以使用自动同步的数组表单:

% path=(a b c d c b a)
% print $path
a b c d c b a
% print $PATH
a:b:c:d:c:b:a
% declare -U path
% print $path
a b c d
% print $PATH 
a:b:c:d

答案 2 :(得分:1)

我的方法就像 rcollyer ,但更通用,处理优先级并使用更多代码。

function append () {
        local val
        eval val=\$$1
        if [[ x$val = x ]] ; then
                eval $1=$2
        else 
                eval $1="$val:$2"
        fi
}

function is_in() {
        local pattern
        pattern=":$1\$|^$1:|:$1:"
        echo $2 | egrep -q "$pattern" &&  return 0
        return 1
}

function append_if_absent() {
        local val
        eval val=\$$1   
        if ! is_in "$2" "$val" ; then
                append "$1" "$2"
        fi
}

export ROOTSYS=/usr/local/root

append_if_absent LD_LIBRARY_PATH $ROOTSYS/lib/root
append_if_absent PATH $ROOTSYS/bin

答案 3 :(得分:0)

我的解决方案是单线:

export PATH=`echo :<new path>:${PATH} | sed -e 's/\:/\n/g' | sort | uniq \
| awk 'BEGIN {ORS=":"} {print $0}'`

其中sed用换行符替换:sortuniq删除任何重复项,awk重建路径。这样做的缺点是订单不能维护,因此如果您希望某个位置的程序优先于其他位置的程序,则会导致问题。我没有实现它,但我想你可以使用perl按顺序维护这些,同时剥离重复项。

答案 4 :(得分:0)

以下是我长期使用的内容:我在.bash_profile或.bashrc中添加了一个名为addpath()的函数,然后我可以在路径中添加一个目录,知道不会有重复。例如:

addpath ~/bin
addpath ~/myproj/bin

以下是addpath()的来源:

function addpath()
{

    if [ $# -eq 0 ]
    then
        echo "  Usage: addpath dir ..."
        return 1
    fi

    local p
    local dir
    local IFS=:
    local found

    for dir; do
        found=0
        for p in $PATH; do
            if [ "$p" = "$dir" ]; then
                found=1
            fi
        done

        if [ "_$found" = "_0" ]; then
            PATH=$PATH:$dir
        fi
    done
}

答案 5 :(得分:0)

来自我的.bashrc:

pathadd() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        PATH="$PATH:$1"
    fi
}

pathadd /usr/local/bin
pathadd ~/bin
...etc

请注意,这会将目录添加到路径的末尾;做出明显的改变,将它们添加到开头。