首页 文章

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

提问于
浏览
1

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

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

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

6 回答

  • 1

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

    if [ "$OPATH" == "" ];
    then
        OPATH=$PATH
    fi
    
    PATH=~/bin:$OPATH
    

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

  • 2

    如果您愿意接受shell的更改, zsh 具有 declare -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
    
  • 0

    我的方法就像 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
    
  • 0

    我的解决方案是一个班轮:

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

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

  • 1

    这是我长期以来一直使用的:我向.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
    }
    
  • 0

    从我的.bashrc:

    pathadd() {
        if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
            PATH="$PATH:$1"
        fi
    }
    
    pathadd /usr/local/bin
    pathadd ~/bin
    ...etc
    

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

相关问题