当前位置: 首页>>技术教程>>正文


当我使用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 中的脚本不应该自动运行吗?

最佳方法

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

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

然后重新启动 zsh ,或者只运行 source ~/.zshrc ,然后你的 PATH 应该完全如你所愿。

或者,如果您想更改为 system-wide,则将前面的代码添加到 /etc/zsh/zshenv 文件的末尾。

但无论如何不要使用 /etc/profile.d 自动运行 zsh 中的脚本。此目录仅适用于 bash shell,而不适用于您的情况中的 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

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

次佳方法

我发现将所有内容都放在一个 .zshenv 文件中很快就会变得难以管理。我建议安装 oh-my-sh,然后将各种自定义项(环境变量、函数)作为单独的 .zsh 文件放置到 .oh-my-sh/custom/ 目录中。

我还发现,当修改环境变量(例如 PATH )时,这种方法可以完美地工作。此外,它与 vcsh 配合使用非常好,可以保持自定义备份和同步。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14233.html,未经允许,请勿转载。