Bash $ PATH正在缓存每个修改

时间:2011-03-03 08:03:40

标签: scripting path bash

如何在BASH中清除$ PATH的缓存。每次我修改$ PATH时,前面的修改也是守旧的!所以我的$ PATH已经是一页了:-),它让我烦恼,因为它指向一些不正确的地方(因为每个修改都附加在$ PATH变量的末尾)。请帮我解决这个问题。

5 个答案:

答案 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一样,它看起来像线路噪音给我,所以我不知道它是如何工作的,但它的工作呢!