Por que minha variável de ambiente está parcialmente definida?

1
  1. Meu objetivo é definir a variável de ambiente JAVA_HOME para um usuário chamado grid , que é apenas o nome de usuário tradicional do hadoop.

  2. Minha máquina é uma máquina virtual implantada no VMware Workstation, 64 bits CentOS7.

  3. O que eu faço: Eu edito o arquivo que deve alterar minha variável de ambiente específica do usuário, por exemplo, ~/.bash_profile . Abaixo está o meu código:

    export JAVA_HOME=/home/grid/jdk
    export HADOOP_HOME=/home/grid/hadoop
    PATH=$PATH:$HADOOP_HOME:$JAVA_HOME
    export PATH
    
  4. Muito interessante, quando eu faço login como usuário grid e executo echo $HADOOP_HOME , recebo /home/grid/hadoop , mas obtenho uma resposta nada quando executo echo $JAVA_HOME , literalmente nada, uma string vazia ou null, algo assim. Eu corro cd $JAVA_HOME e acabo no diretório inicial.

  5. Eu tentei mudar a pasta do JDK, não funcionou. Eu tentei o mesmo código em outra máquina, funcionou. Eu coloquei o código em /etc/profile e loguei como root, a mesma coisa aconteceu, bom para echo $HADOOP_HOME mas nenhuma resposta para echo $JAVA_HOME .

por Sam Chan 22.08.2017 / 18:16

1 resposta

0

Primeiro, um item de nota sobre $PATH . Você tem o JAVA_HOME definido no diretório jdk , mas para o PATH , é necessário fazer isso $JAVA_HOME/bin .

Em segundo lugar, se você precisar que essas variáveis estejam disponíveis para scripts não interativos, convém colocá-las em ~/.bashrc , pois ~/.bash_profile é lido apenas por logins interativos.

Na verdade, a ordem real na qual os perfis (shell de login) são lidos é:

  1. /etc/profile

então:

  1. ~/.bash_profile (no CentOS, se -f ~/.bashrc , origens ~/.bashrc )
  2. ~/.bash_login
  3. ~/.profile (no Ubuntu, se -n $BASH_VERSION , origens ~/.bashrc )

EDIT: Se um desses arquivos for encontrado, outros arquivos não serão processados, a menos que sejam explicitamente fornecidos

Non-login shells (por padrão) só procuram por ~/.bashrc .

Então, dependendo de como você está executando bash , você pode nem estar lendo o perfil ao qual adicionou essas linhas. Você está executando sudo -u grid bash , ou su grid ou su - grid , ou iniciando uma nova sessão ssh cada vez que você testa? Algumas dessas opções podem não acionar um shell bash de login interativo.

Portanto, verifique cada um dos arquivos listados acima e veja se algum deles está desativado ou redefinindo a variável JAVA_HOME . Em seguida, tente adicionar as linhas ao final de ~/.profile , que é o último arquivo originado por um shell de login.

Para fins de depuração, você pode adicionar mensagens ao perfil para garantir que ele também esteja sendo definido corretamente.

~/.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

Isso causará 3 linhas de saída quando você fizer login em um shell de login interativo, e os valores entre os colchetes facilitarão a visualização se os valores estão sendo definidos para começar. Se você vir que JAVA_HOME está sendo definido quando ~/.profile é originado, mas não é definido quando o shell se torna interativo, você sabe que precisa continuar seguindo o processo de login para determinar onde o valor está mudando.

    
por 22.08.2017 / 18:43