为什么我的环境变量设置不完整?

为什么我的环境变量设置不完整?
  1. JAVA_HOME我的目标是为名为的用户设置环境变量grid,这只是 hadoop 的传统用户名。

  2. 我的机器是部署在VMware Workstation中的虚拟机,64位CentOS7。

  3. 我所做的:我编辑应该更改用户特定环境变量的文件,即~/.bash_profile.下面是我的代码:

    export JAVA_HOME=/home/grid/jdk
    export HADOOP_HOME=/home/grid/hadoop
    PATH=$PATH:$HADOOP_HOME:$JAVA_HOME
    export PATH
    
  4. 非常有趣的是,当我以 user 身份登录grid并运行时echo $HADOOP_HOME,我得到了/home/grid/hadoop,但是当我运行时却没有得到任何响应echo $JAVA_HOME,实际上什么都没有,一个空字符串或 null,类似的东西。我运行cd $JAVA_HOME,最终进入主目录。

  5. 我尝试更改JDK文件夹,但没有成功。我在另一台机器上尝试了相同的代码,它有效。我输入代码/etc/profile并以 root 身份登录,发生了同样的事情,很好,echo $HADOOP_HOME但没有响应echo $JAVA_HOME

答案1

首先,有一个值得注意的事项$PATH。您已将其JAVA_HOME设置为jdk目录,但对于PATH,您需要将其设置为$JAVA_HOME/bin

其次,如果您需要这些变量可供非交互式脚本使用,您可能需要将它们放入 中~/.bashrc,因为~/.bash_profile仅由交互式登录读取。

事实上,读取(登录 shell)配置文件的实际顺序是:

  1. /etc/profile

然后:

  1. ~/.bash_profile(在 CentOS 上,如果-f ~/.bashrc, 来源~/.bashrc
  2. ~/.bash_login
  3. ~/.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 变为交互式时未设置,那么您就知道需要继续跟踪登录过程以确定值在何处更改。

相关内容