如何在BASH中清除$ PATH的缓存。每次我修改$ PATH时,前面的修改也是守旧的!所以我的$ PATH已经是一页了:-),它让我烦恼,因为它指向一些不正确的地方(因为每个修改都附加在$ PATH变量的末尾)。请帮我解决这个问题。
答案 0 :(得分:4)
因为每次修改都是如此 附加在$ PATH的末尾 变量
仔细查看您设置$PATH
的位置,我打赌它看起来像这样:
PATH="$PATH:/some/new/dir:/another/newdir:"
在新作业中使用$PATH
会为您提供您不想要的附加行为。
而是这样做:
PATH="/some/new/dir:/another/newdir:"
如果要删除所有重复条目的$PATH
但仍保留原始订单,则可以执行以下操作:
PATH=$(awk 'BEGIN{ORS=":";RS="[:\n]"}!a[$0]++' <<<"${PATH%:}")
答案 1 :(得分:2)
PATH=$(echo $PATH | tr ':' '\n' | sort | uniq | tr '\n' ':')
偶尔执行上面的命令。它将通过删除任何重复来整理您的PATH变量。
-Cheers
PS:警告:这将重新排序PATH变量中的路径。并且会产生不良影响!!
答案 2 :(得分:1)
当我设置我的PATH时,我通常使用这个脚本 - 我在1999年最后修改过,似乎(但是每天都在我所有的基于Unix的计算机上使用)。它允许我添加到我的PATH(或LD_LIBRARY_PATH,或CDPATH,或任何其他类似路径的变量)并消除重复,并删除现在不需要的值。
export PATH=$(clnpath /important/bin:$PATH:/new/bin /old/bin:/debris/bin)
第一个参数是新路径,由您喜欢的任何技术构建。第二个参数是要从路径中删除的名称列表(如果它们出现 - 如果没有则没有错误)。例如,我在任何给定时间安装了最多五个版本的软件。要在版本之间切换,我使用此脚本调整PATH和LD_LIBRARY_PATH以获取我即将开始使用的版本的正确值,并删除我不再使用的版本的值。
: "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
# Print minimal version of $PATH, possibly removing some items
case $# in
0) chop=""; path=${PATH:?};;
1) chop=""; path=$1;;
2) chop=$2; path=$1;;
*) echo "Usage: `basename $0 .sh` [$PATH [remove:list]]" >&2
exit 1;;
esac
# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN { # Sort out which path components to omit
chop="'"$chop"'";
if (chop != "") nr = split(chop, remove); else nr = 0;
for (i = 1; i <= nr; i++)
omit[remove[i]] = 1;
}
{
for (i = 1; i <= NF; i++)
{
x=$i;
if (x == "") x = ".";
if (omit[x] == 0 && path[x]++ == 0)
{
output = output pad x;
pad = ":";
}
}
print output;
}'
':'是一种使用/bin/sh
(最初是Bourne shell - 现在经常是Bash)运行脚本的古老方式。如果我更新它,第一行将成为一个shebang。我也没有在代码中使用制表符。并且有一些方法可以获得不会引用任何引号的'chop'值集:
awk -F: '...script...' chop="$chop"
但它没有被破坏,所以我没有修复它。
答案 3 :(得分:0)
向PATH添加条目时,应检查它们是否已存在。这是我在.bashrc中使用的内容:
pathadd() {
if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
PATH="$PATH:$1"
fi
}
pathadd /usr/local/bin
pathadd /usr/local/sbin
pathadd ~/bin
这只会将目录添加到PATH(如果它们存在(即没有虚假条目)并且尚未存在)。注意:我用来查看条目是否已经在PATH中的模式匹配功能仅在bash中可用,而不是原始的Bourne shell;如果你想在/ bin / sh中使用它,那部分需要重写。
答案 4 :(得分:0)
我有一组很好的脚本,可以根据我想要的顺序将路径变量添加到PATH的开头或结尾。问题是OSX在/ usr / bin之后以/ usr / local / bin开头,这正是我想要的(作为brew用户和所有用户)。所以我所做的是将/ usr / local / bin的新副本放在其他所有内容之前,并使用以下内容删除所有重复项(并保留订购)。
MYPATH=$(echo $MYPATH|perl -F: -lape'$_=join":",grep!$s{$_}++,@F')
我在perlmonks找到了这个。像大多数perl一样,它看起来像线路噪音给我,所以我不知道它是如何工作的,但它的工作呢!