$PATH 中充满了重复项

$PATH 中充满了重复项

我最近开始配置 OSX 10.7 环境进行开发。我安装了 HomeBrew,并将以下内容添加到我的.bash_profile

export PATH="/usr/local/bin:/usr/local/sbin:~/bin:$PATH"        

一切都运行良好,除了我echo $PATH得到以下重复字符串: /usr/local/bin:/usr/local/sbin:~/bin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

为了使其更具可读性,这些是所有路径:

/usr/local/bin
/usr/local/sbin
~/bin:/usr/local/bin
/usr/local/sbin
~/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/usr/X11/bin

除了路径中的一行之外,我认为我没有对路径进行任何更改.bash_profile。 配对这些重复项的最佳方法是什么? 有没有办法找出哪些文件正在修改我的路径并尝试消除它们?

答案1

$PATH无论如何,在发表了我的评论之后,这里有一些修剪建议。

查看您的路径,似乎.bash_profile被执行了两次,或者在其他地方所做的修改.bash_profile被重复了。

有 7 个重复的“/usr/local/git/bin”和“use/local/bin”[原文如此],后面还有 5 个“/usr/local/git/bin”的副本。根据 的git安装方式,您可能能够查询包管理器以了解 安装了哪些文件git;可能有一些配置文件或修改过的系统文件会影响PATH

将其放在set -x的最顶部.bash_login,然后启动一个新的登录 shell。您应该会得到大量输出,这些输出会准确显示bash启动时正在执行的操作,这应该可以帮助您找出PATH修改的位置。set -x一旦您弄清楚了,您可以删除它或放弃。如果您没有找到任何东西,您还可以将其添加到 的开头,以/etc/profile跟踪系统在处理您自己的.bash_profile操作之前执行的操作。

答案2

我跑了Ryan Thompson 的剧本从命令行。
它删除了所有重复项,没有改变顺序,也没有留下尾随:

PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"

除了上面方便的一行代码之外,Ryan 还分享了他用来config删除其他变量重复项的(更结构化的)脚本PATH

有关更多详细信息,请参阅他的 Unix & Linux 帖子

答案3

我将其添加到我的 $HOME/.bashrc(如果您愿意,您也可以将其添加到 .bash_profile)以从 $PATH 中删除重复的条目。我只在 Linux 上测试过,但应该也可以在 Mac 上工作。它应该在初始导出 PATH 之后添加。

export PATH=$(echo $PATH | awk -F: '
{ for (i = 1; i <= NF; i++) arr[$i]; }
END { for (i in arr) printf "%s:" , i; printf "\n"; } ')

答案4

git未经认真初步检查就修改了您的安装.bash_profile。此安装程序损坏了它(显然损坏了 12 次)。使用建议的处方皮疹,而只需定义一次正确的最小路径以将其包含回您的.bash_profile.

你不需要在你的 中初始化你的 PATH .bashrc。这个初始化脚本是为那些必须随着每个 shell 级别而改变的配置保留的,例如提示符、位置、颜色,但不是 PATH。

相关内容