JAVA_HOME
我的目标是为名为的用户设置环境变量grid
,这只是 hadoop 的传统用户名。我的机器是部署在VMware Workstation中的虚拟机,64位CentOS7。
我所做的:我编辑应该更改用户特定环境变量的文件,即
~/.bash_profile
.下面是我的代码:export JAVA_HOME=/home/grid/jdk export HADOOP_HOME=/home/grid/hadoop PATH=$PATH:$HADOOP_HOME:$JAVA_HOME export PATH
非常有趣的是,当我以 user 身份登录
grid
并运行时echo $HADOOP_HOME
,我得到了/home/grid/hadoop
,但是当我运行时却没有得到任何响应echo $JAVA_HOME
,实际上什么都没有,一个空字符串或 null,类似的东西。我运行cd $JAVA_HOME
,最终进入主目录。我尝试更改JDK文件夹,但没有成功。我在另一台机器上尝试了相同的代码,它有效。我输入代码
/etc/profile
并以 root 身份登录,发生了同样的事情,很好,echo $HADOOP_HOME
但没有响应echo $JAVA_HOME
。
答案1
首先,有一个值得注意的事项$PATH
。您已将其JAVA_HOME
设置为jdk
目录,但对于PATH
,您需要将其设置为$JAVA_HOME/bin
。
其次,如果您需要这些变量可供非交互式脚本使用,您可能需要将它们放入 中~/.bashrc
,因为~/.bash_profile
仅由交互式登录读取。
事实上,读取(登录 shell)配置文件的实际顺序是:
/etc/profile
然后:
~/.bash_profile
(在 CentOS 上,如果-f ~/.bashrc
, 来源~/.bashrc
)~/.bash_login
~/.profile
(在 Ubuntu 上,如果-n $BASH_VERSION
, 来源~/.bashrc
)
编辑:如果找到这些文件之一,除非明确来源,否则不会处理其他文件
非登录 shell(默认情况下)仅查找~/.bashrc
.
因此,根据您的执行方式bash
,您甚至可能没有阅读已添加这些行的配置文件。每次测试时,您是否正在执行sudo -u grid bash
、或su grid
、或su - grid
、或启动新的 ssh 会话?其中一些选项可能不会触发交互式登录 bash shell。
因此,请检查上面列出的每个文件,并查看其中是否有任何文件正在取消设置或重置变量JAVA_HOME
。然后尝试将这些行添加到 的末尾~/.profile
,这是登录 shell 获取的最后一个文件。
出于调试目的,您可以将消息添加到配置文件中,以确保其设置正确。
~/.profile
:
export JAVA_HOME=/home/grid/jdk
echo "DEBUG: .profile: JAVA_HOME is [$JAVA_HOME]"
export HADOOP_HOME=/home/grid/hadoop
echo "DEBUG: .profile: HADOOP_HOME is [$HADOOP_HOME]"
PATH=$HADOOP_HOME:$JAVA_HOME/bin:$PATH
echo "DEBUG: .profile: PATH is [$PATH]"
export PATH
当您登录到交互式登录 shell 时,这将导致 3 行输出,并且括号之间的值可以轻松查看这些值是否已在开始时设置。如果你看到那个JAVA_HOME
是在获取源时设置~/.profile
,但在 shell 变为交互式时未设置,那么您就知道需要继续跟踪登录过程以确定值在何处更改。