【问题标题】:ZSH PATH variable entries are backwards on OS X CatalinaZSH PATH 变量条目在 OS X Catalina 上是向后的
【发布时间】:2020-03-26 15:39:34
【问题描述】:

所以我刚刚安装了 macOS Catalina 和 MacPorts。这导致我不得不修改 .zshenv 文件中的 PATH 和 MANPATH 环境变量,如下所示:

# configure an environment variable for Racket
export RACKET=/Applications/Racket

# configure an appropriate PATH variable for use with MacPorts
export PATH="/opt/local/bin:/opt/local/sbin:$RACKET/bin:$PATH"

# configure an appropriate MANPATH variable for use with MacPorts
export MANPATH="/opt/local/share/man:$RACKET/man:$MANPATH"

但是,运行以下命令 echo $PATH 与我的预期相反:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/opt/local/sbin:/Applications/Racket/bin

有什么想法可以解决这个问题吗? /opt/local/* 的全部内容接近尾声的事实正在破坏我使用的相当多实用程序的一些构建脚本。

【问题讨论】:

  • 我建议您选择@yinz Liu 作为解决您问题的答案。

标签: macos path zsh


【解决方案1】:

~/.zshrc~/.zprofile下面添加代码:

# Prepend the $PATH
[[ -f $HOME/.zshenv ]] && source $HOME/.zshenv 
# remove duplicate $PATH
typeset -U PATH

解释:

根据zsh loading order,对于zsh中的任何登录shell,它都会在~/.zshenv之后但在~/.zshrc之前调用etc/zprofile, 其中包含usr/libexec/path_helper:

 # file: etc/zprofile
 # system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
   eval `/usr/libexec/path_helper -s`
fi

上面的代码将/usr/bin:/bin:/usr/sbin:/sbin移动到你自己添加的$PATH前面,例如/opt/local/bin:/opt/local/sbin..

我们在/etc/zprofile之后再次获取.zshenv以再次将自添加路径添加到前面,type -U PATH保持path保持在第一个出现并删除重复的位置。

【讨论】:

  • 我可以在~/.zprofile 中设置export PATH="...:$PATH" 而不是使用[[ -f ~/.zshenv ]] && source ~/.zshenv 吗?哪个更受欢迎?
  • 可以方便的添加多条路径。我通常将系统路径放在最后,所以我再次获取 .zshenv。
【解决方案2】:

我怀疑问题在于.zshenv 在任何其他启动文件之前执行,这些文件也在修改PATH。 (这不是一个完整的解释,因为/etc/zprofile 应该覆盖PATH,而不是在它前面。但它很接近。)

不要在.zshenv 中设置PATH(这是为所有 shell 提供的,无论是否交互),而是在~/.zprofile 中设置。

请参阅man zsh 中有关启动/关闭文件的部分,了解有关哪些文件的来源和时间的完整说明。

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2013-01-15
    • 2019-11-07
    • 2013-11-10
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多