Linux 在bashrc中是否有一种合理的方式将新路径附加到路径?

Linux 在bashrc中是否有一种合理的方式将新路径附加到路径?,linux,bash,path,Linux,Bash,Path,我经常需要将新路径附加到.bashrc中的PATH环境变量,如下所示: 导出路径=/usr/local/bin:$PATH 然后,为了使它生效,我总是使用“source~/.bashrc”或“.~/”。而我发现这样做的一个缺点让我感到不舒服 如果我继续这样做,路径将变得越来越长,并且有许多重复的条目,例如在上一个命令中,如果我将其源代码设置为两次,则路径的值将是 PATH=/usr/local/bin:/usr/local/bin:/usr/local/bin:$PATH(我的解决方案是一行程序

我经常需要将新路径附加到.bashrc中的PATH环境变量,如下所示: 导出路径=/usr/local/bin:$PATH 然后,为了使它生效,我总是使用“source~/.bashrc”或“.~/”。而我发现这样做的一个缺点让我感到不舒服

如果我继续这样做,路径将变得越来越长,并且有许多重复的条目,例如在上一个命令中,如果我将其源代码设置为两次,则路径的值将是
PATH=/usr/local/bin:/usr/local/bin:/usr/local/bin:$PATH(我的解决方案是一行程序:

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

其中
sed
用换行符替换
sort
uniq
去掉任何重复项,然后
awk
重建路径。这确实有一个缺点,即不维护顺序,因此,如果您希望一个位置的程序优先于其他位置的程序,这将导致se问题。我还没有实现它,但我想您可以使用perl在剥离重复项的同时按顺序维护这些问题。

我的解决方案是一行程序:

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

其中
sed
用换行符替换
sort
uniq
去掉任何重复项,然后
awk
重建路径。这确实有一个缺点,即不维护顺序,因此,如果您希望一个位置的程序优先于其他位置的程序,这将导致se问题。我还没有实现它,但我想您可以使用perl在剥离重复项的同时按顺序维护这些问题。

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

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

PATH=~/bin:$OPATH

(代码未测试…

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

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

PATH=~/bin:$OPATH

(代码未经测试…

如果您愿意接受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

如果您愿意接受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

我的方法与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

我的方法与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

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

addpath ~/bin
addpath ~/myproj/bin
以下是addpath()的源代码:


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

addpath ~/bin
addpath ~/myproj/bin
以下是addpath()的源代码:

从my.bashrc:

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

pathadd /usr/local/bin
pathadd ~/bin
...etc
请注意,这会将目录添加到路径的末尾;进行明显的更改,将它们添加到路径的开头。

来自my.bashrc:

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

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

请注意,这会将目录添加到路径的末尾;进行明显的更改以将其添加到开头。

属于超级用户。com@Paul:我倾向于同意(或在serverfault上),但解决方案是编程的。属于超级用户。com@Paul:我倾向于同意,但解决方案是编程的。聪明,但肯定会影响优先级。聪明,但肯定会影响优先级。我测试了代码,它工作正常,首先记录原始内容是聪明的,谢谢。我测试了代码,它工作正常,首先记录原始内容是聪明的,谢谢。