環境変数の永続性がPATH varを破壊するのはなぜですか?

環境変数の永続性がPATH varを破壊するのはなぜですか?

を使用しようとしています/etc/environment

私の変数が消去されましたPATH。それ以降、コマンドは認識されませんでした。

シェルで同じコマンドを実行すると問題はありませんが、なぜこれが起こるのですか? !

私のコンテンツ/etc/environment

ORACLE_HOME=/usr/lib/oracle/12.1/client64
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib

答え1

/etc/environment構成ファイルですpam_env、シェルから読み取ったファイルではありません。構文はやや似ていますが、違います。特に、既存の変数を参照できません。$ORACLE_HOME/binとを含むように検索パスを設定しました$PATH。つまり、名前にドル記号があるディレクトリです。

すべてのユーザーに変数を設定するには、を編集します。/etc/security/pam_env.confこの構文はより多様で豊富な構文を持っていますが、それでもシェルで実行できるほど豊富ではありません。

ORACLE_HOME DEFAULT=/usr/lib/oracle/12.1/client64
PATH OVERRIDE=/usr/local/bin:/usr/bin:/bin:${ORACLE_HOME}/bin
LD_LIBRARY_PATH DEFAULT=$ORACLE_HOME/lib

他の変数は参照できますが、変数の以前の値は参照できません。

より柔軟なアプローチが必要な場合は、変数定義を追加してください/etc/profile。ここでは、すべてのシェル構成を使用できます。欠点は、cronなどを介さずにログインセッションでのみ読むことができることです。. /etc/profile;ただし、cronジョブの起動時に追加すると簡単に利点があります。

export ORACLE_HOME=/usr/lib/oracle/12.1/client64
PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

答え2

割り当ては次のように/etc/environmentする必要があります出口。それ以外の場合、その値は使用されません。 「.」を使用してファイルをインポートする場合は、次の構文を使用します。

export ORACLE_HOME=/usr/lib/oracle/12.1/client64
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

ただし、記載されているように/etc/environmentソースを取得する意図はありません(例:すべてのユーザーに対して環境変数の値を継続的に設定します。)。

~によると6.6。 pam_env - 環境変数の設定/解除(Linux-PAMシステム管理者ガイド):

PAMpam_envモジュールを使用すると、環境変数を設定(設定解除)できます。以前に設定された環境変数とPAM_ITEMの使用をサポートしますPAM_RHOST

/etc/security/pam_env.confデフォルトで他のファイルが指定されていない場合、変数設定(キャンセル)ルールは構成ファイルから取得されます。

このモジュールは簡単な方法でファイルを解析することもできます。キー=値別の回線でペアリングします(/etc/environmentデフォルト)。 envfileフラグを使用して、解析するデフォルトファイルを変更し、readenvフラグをそれぞれ1または0に設定して、オンまたはオフにすることができます。

PAM環境変数の設定は他のモジュールに副作用を引き起こす可能性があるため、このモジュールはスタックの最後のモジュールである必要があります。

つまり、PAM(ユーザー認証)はファイルを読み取り、ユーザーが設定した値がわからない場合は変数を次のように設定します。何もない

逆に修正すると、/etc/profileより良い結果が得られます。しかし、ファイルの上部の説明を読んでください。

# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

/etc/profile.d/custom.sh設定を使用してファイルを生成すると、より良い結果が得られます。

ただし、この設定に問題が発生する可能性がありますLD_LIBRARY_PATH。代わりに、ディレクトリを設定にファイルとして/etc/ld.so.conf.d追加する必要があります(インクルード/etc/ld.so.conf.d/oracleパスなど)。

/usr/lib/oracle/12.1/client64/lib

追加資料:

関連情報