当我使用 ZSH 时,如何在 /etc/profile.d 中设置 PATH?

当我使用 ZSH 时,如何在 /etc/profile.d 中设置 PATH?

我正在使用它zsh作为我的shell,并尝试配置我的环境。

我通常$JAVA_HOME通过创建文件来定义我的变量:

/etc/profile.d/java.sh

内容如下

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

然后我注销并重新登录,一切正常,但由于某种原因PATH未设置变量。它识别JAVA_HOME,但不能识别新的PATH,请参见此终端代码片段:

~  echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_05
~  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

我通过尝试运行 jvm 命令来确认这一点

~  java -version
zsh: command not found: java

不包括应该PATH包括的$JAVA_HOME。还有什么我应该检查的吗?

我已经检查过,如果我运行:

source /etc/profile.d/java.sh

一切都正确运行,并且我的变量也按应有的方式设置,但是脚本不应该/etc/profile.d自动运行吗?

答案1

从我的角度来看,最好的方法是在文件中添加以下几行~/.zshrc(如果您还没有,请创建它):

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi

然后重新启动zsh,或者直接运行source ~/.zshrc,然后你的 PATH 就应该完全符合你的希望。

或者,如果您想对整个系统进行更改,则将前面的代码添加到文件末尾/etc/zsh/zshenv

但无论如何不要使用它/etc/profile.d来自动运行脚本zsh。此目录仅对 shell 有用bash,而不是zsh像你的情况那样。要理解这一点,请打开/etc/profile文件,它是狂欢初始化文件在任何情况下初始化文件,你会在文件末尾的某处看到:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

因此,仅当您在 zsh 初始化文件(例如,或文件中的源)中添加前面的代码时,目录中的脚本/etc/profile.d才会自动运行。zsh/etc/zsh/zprofile/etc/profile/etc/zsh/zprofile

答案2

我发现将所有内容放在一个.zshenv文件中很快就会变得难以管理。我建议安装哦天哪然后将各种定制(环境变量、功能).oh-my-sh/custom/作为单独的.zsh文件放入目录中。

我还发现,当通过 ssh 进入机器并修改环境变量(例如)时,这种方法可以完美地工作PATH。此外,它与虚拟交换机用于保持定制备份和同步。

答案3

既然JAVA_HOME设置了,您已经确认这些脚本是自动获取的,不是吗?

唯一合理的解释是PATH稍后会以某种方式设置。它最初应该由 PAM 设置/etc/environment,其内容为,据我所知,这发生在/etc/profile.d/*.sh获取文件之前。在这方面,zsh 的工作方式可能与 bash 不同。

答案4

运行更新后在本地遇到了这个问题。看来根本问题是 Drush 不知道在哪里可以找到包含 pdo 的 php 的合法副本。幸运的是,它支持将此路径存储在环境变量中,因此我在命令行上执行了此操作:

export DRUSH_PHP="/Applications/MAMP/bin/php/php5.4.39/bin/php"

问题解决了,所以我编辑了 .zshrc 并将其添加到文件中,问题解决了。

相关内容