我经常需要在.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而不会让它变得难看?
答案 0 :(得分:2)
另一种方法是检查是否未设置OPATH。如果是,请将其设置为PATH。这将是你原来的路径。
if [ "$OPATH" == "" ];
then
OPATH=$PATH
fi
PATH=~/bin:$OPATH
(代码未经测试......)
答案 1 :(得分:1)
如果您愿意接受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
答案 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
用换行符替换:
,sort
和uniq
删除任何重复项,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
请注意,这会将目录添加到路径的末尾;做出明显的改变,将它们添加到开头。