Scripting Bash$PATH正在缓存每次修改

Scripting Bash$PATH正在缓存每次修改,scripting,path,bash,Scripting,Path,Bash,如何在BASH中清除$PATH的缓存。每次我修改$PATH时,前面的修改也会保持不变!因此,我的$PATH已经是一页了:-),这让我很困扰,因为它指向了一些不正确的地方(因为每次修改都被追加到$PATH变量的末尾)。请帮我解决这个问题 因为每一次修改都在进行中 附加在$PATH的末尾 变数 仔细看看您在哪里设置$PATH,我打赌它看起来像这样: PATH="$PATH:/some/new/dir:/another/newdir:" 在新的赋值中使用$PATH,会给您带来不想要的追加行为 而是这

如何在BASH中清除$PATH的缓存。每次我修改$PATH时,前面的修改也会保持不变!因此,我的$PATH已经是一页了:-),这让我很困扰,因为它指向了一些不正确的地方(因为每次修改都被追加到$PATH变量的末尾)。请帮我解决这个问题

因为每一次修改都在进行中 附加在$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%:}")
PATH=$(awk'BEGIN{ORS=“:”;RS=“[:\n]”)a[$0]+'
因为每一次修改都在进行中
附加在$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%:}")

PATH=$(awk'BEGIN{ORS=“:”;RS=“[:\n]”a[$0]+'当我设置路径时,我通常使用这个脚本-我上次修改它似乎是在1999年(但在我所有基于Unix的计算机上每天都使用)。它允许我添加到我的路径(或LD_LIBRARY_PATH,或CDPATH,或任何其他类似于变量的路径)并消除重复项,现在修剪掉不需要的值

用法 第一个参数是新路径,由您喜欢的任何技术构建。第二个参数是要从路径中删除的名称列表(如果出现,则不会出错)。例如,我在任何给定时间都安装了大约五个版本的软件。要在版本之间切换,我使用此脚本调整PATH和LD_LIBRARY_PATH,以获取我将要开始使用的版本的正确值,并删除我不再使用的版本的值

密码
但是它没有坏,所以我还没有修复它。

当我设置路径时,我通常使用这个脚本——我上次修改它似乎是在1999年(但每天都在我所有基于Unix的计算机上使用)。它允许我添加到我的路径(或LD_LIBRARY_PATH,或CDPATH,或任何其他类似于变量的路径)并消除重复项,现在修剪掉不需要的值

PATH=$(echo $PATH | tr ':' '\n' | sort | uniq | tr '\n' ':') 
用法 第一个参数是新路径,由您喜欢的任何技术构建。第二个参数是要从路径中删除的名称列表(如果出现,则不会出错)。例如,我在任何给定时间都安装了大约五个版本的软件。要在版本之间切换,我使用此脚本调整PATH和LD_LIBRARY_PATH,以获取我将要开始使用的版本的正确值,并删除我不再使用的版本的值

密码 但它没有坏,所以我还没有修好

PATH=$(echo $PATH | tr ':' '\n' | sort | uniq | tr '\n' ':') 
偶尔执行上述命令。它将通过删除任何重复项来整理PATH变量

-干杯

警告:这将在PATH变量中重新排列路径。并且可能会产生不希望的效果

偶尔执行上述命令。它将通过删除任何重复项来整理PATH变量

-干杯


警告:这将在PATH变量中对路径进行重新排序。并且可能会产生不希望出现的效果!!

在向PATH添加条目时,您应该检查它们是否已经存在。下面是我在.bashrc中使用的内容:

pathadd() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        PATH="$PATH:$1"
fi
}
pathadd /usr/local/bin
pathadd /usr/local/sbin
pathadd ~/bin

这只会将目录添加到路径(如果存在)(即没有虚假条目)注意:我用来查看条目是否已经在PATH中的模式匹配功能仅在bash中可用,而在原始Bourne shell中不可用;如果要将此功能与/bin/sh一起使用,则需要重写该部分。

在将条目添加到PATH时,应该检查它们是否已经存在。下面是我在我的应用程序中使用的内容。bashrc:

pathadd() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        PATH="$PATH:$1"
fi
}
pathadd /usr/local/bin
pathadd /usr/local/sbin
pathadd ~/bin

这只会将目录添加到路径(如果存在)(即没有虚假条目)注意:我用来查看条目是否已经在PATH中的模式匹配功能仅在bash中可用,而不是在原始的Bourne shell中;如果您想将此功能与/bin/sh一起使用,则需要重写该部分。

我有一组很好的脚本,可以根据ord将路径变量添加到路径的开头或结尾我想要。问题是OSX在/usr/bin之后以/usr/local/bin开头,这完全不是我想要的(作为brew用户和所有人)。因此,我要做的是将/usr/local/bin的新副本放在所有其他副本之前,并使用以下命令删除所有副本(并保留订购)


我在上发现了这一点。与大多数perl一样,它看起来像是行噪声,所以我不知道它是如何工作的,但它确实可以工作!

我有一套不错的脚本,可以根据我想要的顺序将路径变量添加到路径的开头或结尾。问题是OSX在/usr/local/bin之后以/usr/bin开头,这正是我想要的(作为brew用户和所有人)。因此,我要做的是将/usr/local/bin的新副本放在所有其他副本之前,并使用以下方法删除所有副本(并保留订购)


我在上找到了它。与大多数perl一样,它看起来像是行噪声,所以我不知道它是如何工作的,但它确实工作!

但是如果我使用第二种方法,那么$PATH中的其他变量将被删除。我可能会覆盖一些重要的变量(可能是系统)命令!@Narek您的问题说您不想保留以前的修改,但您的评论说您想保留,您不能两全其美!您是在问我如何更改$PATH,以便在您要添加的新目录已经存在的情况下,它不会被复制吗?@Narek请查看我的更新以执行我正在执行的操作