環境変数の設定が不完全な理由は何ですか?

環境変数の設定が不完全な理由は何ですか?
  1. JAVA_HOMEgrid私の目標は、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. 非常に興味深いことに、ユーザーとしてログインして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に設定しましたが、場合には設定する必要があります。jdkPATH$JAVA_HOME/bin

次に、これらの変数を非対話型スクリプトで使用できる必要がある場合は、対話型ログインでのみ読み取ることができるため、その~/.bashrc変数を配置する必要があります。~/.bash_profile

実際に(ログインシェル)設定ファイルを読み取る実際の順序は次のとおりです。

  1. /etc/profile

それから:

  1. ~/.bash_profile(CentOSでは-f ~/.bashrc、source ~/.bashrc
  2. ~/.bash_login
  3. ~/.profile(Ubuntuでは-n $BASH_VERSION、source ~/.bashrc

編集:これらのファイルのいずれかが見つかった場合、ソースが明確でない限り、他のファイルは処理されません。

非ログインであるシェル(デフォルトでは)は~/.bashrc

したがって、実行方法によっては、bashこれらの行が追加された構成ファイルを読み取ることができない場合があります。テストするたびにsudo -u grid bashsu gridまたは、またはを実行するsu - gridか、新しいSSHセッションを開始していますか?これらのオプションの一部は、対話型ログイン bash シェルをトリガーしない場合があります。

したがって、上記の各ファイルを確認し、それらの変数を設定解除またはリセットするファイルがあることを確認してくださいJAVA_HOME。次に、~/.profileログインシェルがインポートする最後のファイルの最後に次の行を追加します。

デバッグ目的で設定ファイルにメッセージを追加して、正しく設定されていることを確認できます。

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

これにより、対話型ログインシェルにログインすると3行の出力が得られ、括弧の間の値を見ると、その値が最初に設定されていることを簡単に確認できます。見たらJAVA_HOME はいソースのインポート時に設定されますが、~/.profileシェルがインタラクティブになると設定されません。これにより、値が変更された場所を確認するためにログインプロセスを追跡し続ける必要があることがわかります。

関連情報