Oh-My-ZSH PATH 的位置不在 .zshrc 中,但在回显时仍在路径中

Oh-My-ZSH PATH has locations that aren't in .zshrc but are still in path upon echo

编辑:

我现在已经删除了 .zshrc 文件第 1 行的 $HOME/bin:/usr/local/bin: 部分。所以现在该行显示为 export PATH=$PATH。这摆脱了重复项,但它仍然没有解释 Mono 和 Postgres 被添加到路径中的位置。

以下是路径以可读格式输出的内容:

/usr/local/bin:
/usr/bin:
/bin:
/usr/sbin:
/sbin:
/Library/Frameworks/Mono.framework/Versions/Current/Commands:
/Applications/Postgres.app/Contents/Versions/latest/bin

是否有另一个文件正在处理这些路径的导出?

原文:

所以我实在想不出一个很好的标题,所以如果有人有什么建议请在评论中提出。

这是我的问题。我刚刚使用以下命令将 .zshrc 文件重置为默认模板。

cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

所以这是我 .zshrc

的文件内容
export PATH=$HOME/bin:/usr/local/bin:$PATH

export ZSH=$HOME/.oh-my-zsh

ZSH_THEME="agnoster"

plugins=(
  git
)

source $ZSH/oh-my-zsh.sh

以下文件要么完全为空,要么全部被注释掉:.zprofile.bash_profile.bashrc.

在我的终端中 运行 source .zshrc 命令后跟 echo $PATH 命令之后,这是我的输出。

/Users/jrobinson/bin:/usr/local/bin:/Users/jrobinson/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Applications/Postgres.app/Contents/Versions/latest/bin

让我们稍微格式化一下,这样我们就可以看到发生了什么:

/Users/jrobinson/bin:
/usr/local/bin:
/Users/jrobinson/bin:
/usr/local/bin:
/usr/local/bin:
/usr/bin:
/bin:
/usr/sbin:
/sbin:
/Library/Frameworks/Mono.framework/Versions/Current/Commands:
/Applications/Postgres.app/Contents/Versions/latest/bin

如您所见,有些东西在重复,例如 /usr/local/bin & /Users/jrobinson/bin

此外,我曾在我的计算机上安装过 Postgres,但现在已不再安装。我仍然拥有并使用 Mono,但我不知道 它在何处 添加到我的路径中。

我在路径中唯一定义的是:export PATH=$HOME/bin:/usr/local/bin:$PATH

那么为什么我会收到这些重复的东西?我假设这是因为某些文件中某处有一些重复代码,我无法确定这些重复发生的位置,因此我可以删除它们并清理我的 PATH。

ALSO 这真的很奇怪,我的电脑上也安装了 Composer,即使我没有定义 Composer 我也可以使用 composer 命令在我 /.composer/vendor/bin.

的道路上

path_helper是构建PATH环境变量的助手。这是 macOS 独有的。

man path_helper

Files in these directories should contain one path element per line.

Prior to reading these directories, default PATH and MANPATH values are obtained from the files /etc/paths and /etc/manpaths respectively.

GUI 应用程序可以将文件放入这些路径。 shell 启动时,path_helper 会将其中的值添加到 PATHMANPATH 中。重点似乎是 通过在其中创建符号链接来避免污染 /usr/bin/usr/local/bin

对于 bash,path_helper 在 shell 启动时在 /etc/profile 中调用。对于 zsh,path_helper/etc/zprofile.

中被调用

/etc/profile的内容:

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

path_helper -s

-s Generate Bourne shell commands on stdout. This is the default if SHELL does not end with "csh".

参考资料

  • man path_helper

在全新 ubuntu 20.04 安装和整理我的 .zshrc 文件后,即使在 .zshrc 文件中注释掉它们之后,我仍能在 $path 中看到位置。更令我惊讶的是,那些显示在 bash $path 以及在那里声明 none 的地方(检查下图中的 DJANGO_HOME)。每次更改后多次使用 source 命令,但没有结果。

浪费了宝贵的10分钟时间。然后发现在新终端上一切正常 window。所以杀死以前的终端并移动到一个新的终端解决了它。