解释

解释

在我的 MacBook 上,我使用 zsh,我通过.zshenv和一个.zshrc

如果我echo在 的末尾添加一条语句.zshenv,该$PATH变量将如下所示:

/opt/homebrew/bin
/opt/homebrew/sbin
$HOME/.local/bin
/usr/bin
/bin
/usr/sbin
/sbin

然而,启动终端后,看起来$PATH像这样:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/opt/homebrew/bin
/opt/homebrew/sbin
$HOME/.local/bin

echo $PATH在 my - 的开头添加了一条语句.zshrc,该语句源自,并且实际上我验证了在加载.zshenv时,已更改为第二个。.zshrc$PATH我该如何防止这种情况?

我想这与 中的文件有关/etc?例如,我注意到有一个/etc/paths包含以下内容的文件:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

答案1

这个问题的答案可以在这个问题在 AskDifferent(Unix&Linux StackExchange 的 Apple 版本)上。

解释

当 zsh 被获取时,文件按以下顺序读取(来自 zsh 官方文档):

首先从 /etc/zshenv 读取命令;这不能被覆盖。[...] 然后从 $ZDOTDIR/.zshenv 读取命令。如果 shell 是登录 shell,则从 /etc/zprofile 读取命令,然后从 $ZDOTDIR/.zprofile 读取。然后,如果 shell 是交互式的,则从 /etc/zshrc 读取命令,然后从 $ZDOTDIR/.zshrc 读取。最后,如果 shell 是登录 shell,则读取 /etc/zlogin 和 $ZDOTDIR/.zlogin。

在 macOS 中/etc/zprofile,源脚本$PATH根据这些文件的内容覆盖:

  • /etc/paths
  • /etc/paths.d
  • /etc/manpaths
  • /etc/manpaths.d

怎么解决?

要解决这个问题,您可以:

  1. 直接修改/etc/paths(不推荐)
  2. $PATH将修改的行移至.zprofile.zshrc

相关内容