问题描述
我使用 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 配合使用非常好,可以保持自定义备份和同步。