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

Rod*_*aki 24 zsh environment-variables

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

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

/etc/profile.d/java.sh
Run Code Online (Sandbox Code Playgroud)

有以下内容

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

然后我注销并重新登录,一切正常,但由于某种原因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
Run Code Online (Sandbox Code Playgroud)

我通过尝试从 jvm 运行命令来确认它

~  java -version
zsh: command not found: java
Run Code Online (Sandbox Code Playgroud)

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

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

source /etc/profile.d/java.sh
Run Code Online (Sandbox Code Playgroud)

它全部运行正确,我的变量设置为它们应该的,但脚本不应该/etc/profile.d自动运行吗?

Rad*_*anu 30

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

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi
Run Code Online (Sandbox Code Playgroud)

然后重新启动您的zsh,或者只是运行source ~/.zshrc,然后您的 PATH 应该完全符合您的意愿。

或者,如果您想在系统范围内进行更改,请将之前的代码添加到/etc/zsh/zshenv文件末尾。

但无论如何不要使用/etc/profile.dzsh. 此目录仅对bashshell有用,而zsh不像您的情况。要理解这一点,请打开/etc/profile文件,它是一个bash初始化文件,绝不是zsh初始化文件,您将在文件末尾的某处看到:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi
Run Code Online (Sandbox Code Playgroud)

所以,从你的脚本/etc/profile.d目录会自动运行zsh只有当您在zsh的初始化文件添加前面的代码,像/etc/zsh/zprofile例如,或源/etc/profile/etc/zsh/zprofile文件。

  • 也许`~/.zprofile` 可能比`~/.zshrc` 更好。 (6认同)