Linux 在bashrc中是否有一种合理的方式将新路径附加到路径?
我经常需要将新路径附加到.bashrc中的PATH环境变量,如下所示: 导出路径=/usr/local/bin:$PATH 然后,为了使它生效,我总是使用“source~/.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(我的解决方案是一行程序
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的更改,
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
如果您愿意接受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:我倾向于同意,但解决方案是编程的。聪明,但肯定会影响优先级。聪明,但肯定会影响优先级。我测试了代码,它工作正常,首先记录原始内容是聪明的,谢谢。我测试了代码,它工作正常,首先记录原始内容是聪明的,谢谢。