/ etc / environment vs .profileでのPATH変数の設定


58

PATHenvvar を設定するのに適した場所はどこですか?

~/.profileまたは/etc/environment

PATH両方の場所に設定されている場合はどうなりますか?最終結果は、これらの2つの場所で設定された両方の値の連結ですか?


もちろん、PATHへの最後の割り当てが優先されます。ほとんどのスクリプトは、スクリプトの先頭で明示的に設定します。
AlexP

3
help.ubuntu.com/community/…を参照してください。
edwinksl 16

回答:


71

概要:

  • あなたはパス(たとえばを追加したい場合は/your/additional/path、あなたに)PATHお使いのコンピュータのすべてのユーザーのためだけではなく、あなたの現在のユーザーのための変数は、通常の終わりにそれを置く~/.profileこれらの2つの例のいずれかのように:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

    パスの優先順位は左から右に降順であるため、最初のパスの優先順位が最も高いことに注意してください。の左側にパスを追加$PATHすると、最も優先度が高くなり、その場所にある実行可能ファイルが他のすべてを上書きします。右側にパスを追加すると、優先度が最も低くなり、他の場所からの実行可能ファイルが優先されます。

  • あなたは、すべてのユーザーのために、その環境変数を設定する必要がある場合は、私はまだ触れてお勧めしません/etc/environmentが、で終わるファイル名のファイルの作成.shには/etc/profile.d//etc/profile内のスクリプトとすべてのスクリプトは/etc/profile.d、各ユーザーの個人の世界的な等価です~/.profileし、彼らの初期化中に、すべてのシェルで通常のシェルスクリプトとして実行します。


より詳しく:

  • /etc/environmentシステム全体の構成ファイルです。つまり、すべてのユーザーが使用します。rootただし、所有者であるため、管理ユーザーであり、それを使用sudoして変更する必要があります。

  • ~/.profile自分のユーザーの個人用シェル初期化スクリプトの1つです。すべてのユーザーは1つを持っており、他のユーザーに影響を与えることなくファイルを編集できます。

  • /etc/profileおよび/etc/profile.d/*.shは、~/.profile各ユーザーに相当するグローバル初期化スクリプトです。ただし、グローバルスクリプトはユーザー固有のスクリプトの前に実行されます。メイン/etc/profileは、終了*.shする/etc/profile.d/直前にすべてのスクリプトを実行します。


  • /etc/environment通常、ファイルには次の行のみが含まれます。

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    PATHシステム上のすべてのユーザーの変数をこのデフォルト値に設定しますが、この値は大幅に変更しないでください。少なくとも、次のような重要なパスのいずれかを削除しないでください/bin/sbin/usr/binおよび/usr/sbinそれから。

    このファイルは、すべてのユーザーのすべてのシェルによって最初の構成ファイルの1つとして読み取られます。シェルスクリプトではないことに注意してください。それは単に構成ファイルであり、何らかの方法で解析され、環境変数の割り当てのみを含む場合があります!

  • ~/.profileファイルには、かどうか、それは他のものの間でのチェックが含まれているデフォルトでは、多くのものを含めることができます~/binディレクトリが存在し、ユーザーの既存のものを追加してPATH無条件にそれを追加している- - Ubuntuは16.04前にリリース高齢に(このように、変数と18.04を上、「〜/ .local / bin」も追加されます):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    PATHここで古い値が再利用され、すべてを上書きするのではなく、新しいパスが先頭にのみ追加されることがわかります。手動で新しいパスを追加する場合は、常に$PATH新しい値のどこかに古い値を保持する必要があります。

    この初期化スクリプトは、それが属するユーザーのシェルによってのみ読み取られますが、別の条件があります。

    # ~/.profile: executed by the command interpreter for login shells.
    # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
    # exists.
    

    そのため、デフォルトのBashシェルを使用する場合は、ユーザーに影響を与えないようにする~/.bash_profile~/.bash_login、変更を有効にする必要があるかどうかを確認する必要があり~/.profileます。


環境変数の完全な理解については、https//help.ubuntu.com/community/EnvironmentVariablesを参照して ください。


関連質問:bash.bashrcと/ etc / environmentファイルの違い


2
昨今~/.profileの存在をチェックしません~/binが、それは単にラインを持っている:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
グンナーHjalmarsson

1
@GunnarHjalmarsson「今日」を定義してください。私は16.04を実行していますが、それはそこに見える方法です。
バイトコマンダー

2
/etc/skel/.profile16.04には、私が言及した行があります。以前のリリースでユーザーを作成したようです。
グンナルHjalmarsson 16

1
@GunnarHjalmarsson情報をお寄せいただきありがとうございます- 約5分前まで、デフォルトで~/.profileもこれはまだあると思いましたが、そうです- /etc/skel/.profileアップグレードされた16.04システム(および16.04のインストール時に作成されたユーザーアカウント)にはありません別のマシンにはがありません.profile)。
エリアケイガン

2
「...初期化中にすべてのシェルによって通常のシェルスクリプトとして実行されます。」これは誤解を招くと思います。GUIデスクトップから非ログインターミナルシェルを開くだけで/ etc / profileが実行されるように(一部には)提案される場合がありますが、実行されません。askubuntu.com/questions/155865/...
ホークアイパーカー

22

この答えは、主に、さまざまな構成ファイルで指定された場合のような環境変数PATHが割り当てられる順序に関するものです。また、通常それらを設定する場所についても説明しますが、以下のリストでは、ファイルの使用を検討すべき順序でファイルをリストしていません。PATHUbuntu での設定およびその他の環境変数に関する一般的な情報については、EnvironmentVariablesおよびこの質問に対するその他の回答を読むこともお勧めします。

設定PATHする場所は、設定する必要があるユーザーと、いつどのように設定するかによって異なります。決定の一部は、環境変数をすべてのユーザーに設定するか、ユーザーごとに設定するかです。不明な場合は、システム全体ではなく、1人のユーザー(アカウントなど)のみに設定することをお勧めします。

以下のようAlexPは言うPATH環境変数は、それがされた値になります割り当てられた最新のを。実際には、ほとんどの場合、を設定すると、以前のエントリが保持されるように、新しい値に古いPATHを含めます。PATH

したがって、実際にPATHは、複数のファイルから設定される場合、通常はすべてのファイルで指定されたエントリが含まれます。しかし、それは、最初のPATH変数を除いて、それを設定するすべてのファイルが通常変数自体を参照し、その古い値が新しい値を含むためにのみ起こります。

したがって、実際には、PATHさまざまなファイルの設定が有効になる順序を尋ねています。

設定PATHする一般的な汎用の場所を、ユーザーがログインするときに有効になる順序で以下にリストします通常使用することを検討する順序ではありません。下記に記載されている場所は、それぞれ設定するための合理的な選択であるPATH いくつかの状況が、唯一のいくつかは、ほとんどの時間は良い選択です。

以下のリストには、などのディレクトリ名が表示され~/.profileます。チルダの展開に慣れていない場合~/、現在のユーザーのホームディレクトリを参照します。主にコンパクト化のためにこの構文を使用します。シェルスクリプトではサポートされていますが、PAM構成ファイルではサポートされていません

1.すべてのユーザーの場合: /etc/environment

UbuntuのPAM/etc/environmentは、そのファイルが存在する場合、デフォルトで設定されている環境変数を設定します。これが、すべてのユーザーの環境変数が最も一般的に設定される方法です。

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

ユーザーアカウントだけでなく、すべてのユーザーアカウントに環境変数を設定する必要がある場合は、おそらくそのファイルを変更するのが最善の選択です。最初にバックアップすることをお勧めします。このファイルをバックアップする1つの方法は、次を実行することです。

sudo cp /etc/environment /etc/environment.orig

.origあなたが混乱したり、すでに使用されていないのですバックアップファイルは何も命名についての良い感じることができる-拡張子は特に必要ありません。(加えて.orig.old.backupおよび.bak一般的です。)

あなたは、rootユーザー(と他のファイルを編集可能性のいずれかの方法でこのファイルを編集することができsudoedit /etc/enviromnmentsudo nano -w /etc/environmentgksudo gedit /etc/environment、など)

/etc/environment変数の古い値を自動的に含めることはサポートしていません。しかし、これは通常は不要です。ほとんどの場合、編集してすべてのユーザーに環境変数を設定する/etc/environmentので、ユーザーがログインするときにそれを初期値にする必要があります。ユーザーは、必要に応じて変更できます。通常、ユーザーがこれを実行できると便利です。

2.すべてのユーザーの場合: /etc/security/pam_env.conf

PAMは、ユーザー/etc/security/pam_env.confごとの~/.pam_environmentファイルで使用されるのと同じ構文で指定されたから、すべてのユーザーの環境変数を読み取ります(以下を参照)。

同じ環境変数の両方に設定されている場合/etc/environment/etc/security/pam_env.conf、の値pam_env.confに使用される-その値は以下のように指定されていてもDEFAULTではなくOVERRIDE

あなたがラインに取って代わるときしかし、environment中1でpam_env.conf、あなたは取って代わら値の内容を含めることができます。詳細については、以下のセクションを参照し.pam_environmentてください(同じ構文を使用しているため)。

通常、編集する必要はありません。その場合、非常に注意する必要がpam_env.confあります。通常、不正な形式の行により、通常のユーザーアカウントがすべてログインできなくなるためです。たとえば、デフォルトにpam_env.confは次の行が含まれます。

#PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

これは、いくつかの例の1つとして提示されています。それが説明するものの1つは、複数の行に割り当てを分割する方法\です。最初の行のコメントを外したが、2行目のコメントを外すのを忘れたとします。

PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

これをしないでください!

私は偶然に自分自身をテストしましたが、ユーザーが正常にログインできませんでした。修正するには、リカバリモードで起動して、元に戻す必要がありました。(幸いなことに、これはテストにのみ使用する仮想マシンで実行したため、問題は発生しませんでした。)

3. 1人のユーザーの場合:.pam_environmentユーザーのホームディレクトリ内

単一のユーザーに環境変数を設定する方法の1つは、そのユーザー.pam_environmentがホームディレクトリで編集(または作成)することです。このファイルに設定された値は、グローバル/etc/environmentファイルに設定された値よりも優先されます。

.pam_environmentユーザーアカウントが最初に作成されたときにユーザーのホームフォルダーにコピーされるファイルのスケルトンの一部ではありません。ただし、そのファイルをホームディレクトリに作成する場合、それを使用してなどの環境変数を設定できますPATH/etc/environment(ただし/etc/security/pam_env.conf)とは異なり、ユーザーごとの.pam_environmentファイルは、環境変数の古い値を新しい値に拡張することをサポートします。ただし、これらはシェルスクリプトではないため、これを実現するには特別な構文を使用する必要があります。これは、などのファイルで使用する構文とは多少異なります.profile

たとえばbin2、ホームディレクトリにの最後に追加したいディレクトリがある場合PATH、次の行を.pam_environment次の行に追加することでそれを行うことができます。

PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2

参照サブセクションEnvironmentVariables、(上記の例では密接に適合された)を、そして詳細については。~/.pam_environmentman pam_envman pam_env.conf

これは、Ubuntuユーザーが環境変数を変更または追加するための推奨される方法としてかつて宣伝されていましたが、依然として合理的で許容可能な選択肢と考えられていますが、編集する場合は注意が必要.pam_environmentです。システム全体の編集/etc/security/pam_env.conf(上記を参照)と同様に、ユーザーの.pam_environmentファイルの不正な行はログインの成功を妨げます。(私はこれをテストしている- 。目的に今回の)方法について提言をしている進化し、参照グンナーHjalmarssonコメント 以下、このubuntu-devel議論

一般に、このようなミスはpam_env.conf1人のユーザーにしか影響しないため、の不正な行よりもはるかに深刻ではありません。ただし、ログインを許可するユーザーアカウントが1つしかないデスクトップUbuntuシステムの場合、編集中のこのようなミスは、誤った編集.pam_environmentと同じくらいひどくなりpam_env.confます-まだログインしていない場合は、できませんリカバリモードで(またはライブUSBなどから)起動せずに修正します。

(他のユーザーアカウントを持っている場合は、別のユーザーとしてログインして問題を修正できます。管理者でなくsudo、rootになれない場合でも、実行し、(自分の)パスワードではなく入力するように求められます。 。ゲストそれは使用してから禁止されているようアカウントは、しかし、これを行うことはできません別のユーザーの身元を引き受けること。)su your-accountsu

4.すべてのユーザー:/etc/profileおよび内部のファイル/etc/profile.d/

Bourne互換シェル(bashUbuntuのデフォルトのユーザーシェルを含む)は/etc/profile、ログインシェルとして呼び出されたときにコマンドを実行します。

Ubuntuの/etc/profile.d終わり:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

これにより、/etc/profile.d/名前が終わるディレクトリ内の任意のファイルのコマンド.shも実行されます。

ほとんどのディスプレイマネージャーは、グラフィカルログインでもコマンド/etc/profile(およびファイル/etc/profile.d)を実行します。ただし、すべてがそうと限らず、代わりにPAMによって提供される機能を使用することを支持する重要な議論です(上記を参照)-このシステムへのグラフィカルなログインが決してない場合を除き、たとえば、 GUIがインストールされていないサーバー。

でシステム全体の環境変数を設定するのが伝統的ですが/etc/profile、これは多くの場合、もはや最良の選択ではありません。で環境変数を設定できず/etc/environment、すべてのユーザーに設定する必要がある場合は、自分で/etc/profile.d/編集するよりも新しいファイルを作成する方がおそらく良いでしょう/etc/profile。この理由の1つは、Ubuntuをアップグレードすると、新しいデフォルト/etc/profileファイルが作成される可能性があるためです。アップグレードの実行方法に応じて、その特定の更新された構成ファイルに先立って、(変更を加えた)古いファイルが保持されるか、状況を処理するように求められます。

同じ環境変数がに設定され/etc/profile、1つ以上のファイルがに設定されている場合/etc/profile.d、どちらが最後に実行されますか?これは、/etc/profileそのセット内のコマンドがprofile.d(上記で引用したコードによって)ファイルがソースされる前または後に表示されるかどうかに依存します。のコマンドは/etc/profile表示順に実行されます。

/etc/profileシェルスクリプトで、その構文があるではない上記のPAM設定ファイルと同じ。その構文は、ユーザーごとの~/.profileファイルの構文と同じです(以下を参照)。

特定のディレクトリを追加する(およびすべてのユーザーに対して追加する)かどうかを決定するコードを記述する必要がある場合PATH、それを使用/etc/environmentまたは/etc/security/pam_env.conf実行することはできません。これはおそらく、使用する方が良いです主な状況である/etc/profile/etc/profile.d/代わりに。

5. 1人のユーザーの場合:.bash_profileユーザーのホームディレクトリ内

ユーザーが持っている場合~/.bash_profile、bashは代わりにそれを使用しています~/.profile~/.bash_login(下記参照します)。通常.bash_profile、ホームディレクトリにある必要はありません。

その場合、通常、ソースへのコマンド~/.profile(例:)を含める必要があります. "$HOME/.profile"。そうしないと、ユーザーごとの.profileファイルの内容はまったく実行されません。

6. 1人のユーザーの場合:.bash_loginユーザーのホームディレクトリ内

ユーザーがを持っている場合~/.bash_login、bashは~/.profile(以下を参照)の代わりにそれを使用します(~/.bash_profile存在しない場合)。

の場合と同様に.bash_profile、通常.bash_login、ホームディレクトリにファイルを置くべきではありません。

7. 1人のユーザーの場合:.profileユーザーのホームディレクトリ内。

Bourneスタイルのシェルをログインシェルとして実行すると、コマンドを実行します/etc/profile(通常、ファイル内のコマンドを実行させるコマンドが含まれます/etc/profile.d/-上記を参照)。その後.profile、ユーザーのホームディレクトリでコマンドを実行します。このファイルは、ユーザーごとに個別です。(Bashは実際に実行される.bash_profile.bash_login、存在する場合は代わりに実行されますが、Ubuntuシステムのユーザーの場合、これらのファイルはほとんど存在しないか、存在します。詳細については、上記およびBashマニュアルの6.2 Bashスタートアップファイルを参照してください。)

~/.profileしたがって、ユーザーがログオン時に実行するコマンドを配置する主な場所です。を設定するのは伝統的な場所ですPATHが、Ubuntuにはpam_envモジュールとsupportがあるため~/.pam_environment、それを使用することを検討する必要があります。

同じように/etc/profile、ほとんどが行うものの、すべてのディスプレイマネージャは、グラフィカルログインのため、このファイルを実行しません。これが~/.pam_environment環境変数の設定を好む理由です(人が好む/etc/environmentように/etc/profile)。

あなたには、環境変数を展開することができPATH、設定したときに、自分自身をPATH.pam_environment(上記参照します)。ただし、PATHより洗練された方法で設定する必要がある場合は、.profile代わりに使用する必要があります。特に、ユーザーがログインするたびにディレクトリが存在するかどうかを確認し、存在する場合にのみ追加するPATH場合、.pam_environmentファイルを使用してそのディレクトリをに追加することはできませんPATH

たとえば、.profileUbuntu のデフォルトのユーザーごとのファイルは、次で終わる:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

詳細についてはByte Commanderの回答に対するGunnar Hjalmarssonコメントを参照してください。

これbinにより、ホームディレクトリのサブディレクトリがあるかどうかが確認されます。その場合、サブディレクトリをの先頭に追加しますPATH

そのリストはいくつかの可能性を省略しています。

ユーザーがログインするときに環境変数を設定する方法は他にもあり、それはログインのタイプにより大きく依存します。たとえば、グラフィカルログインまたはSSHベースのリモートログインのみのために設定される環境変数が存在する場合があります。上記のリストはそのような場合をカバーしていません。

私は、人々は時々同じように、環境変数を定義するいくつかのファイルを残してきた~/.bashrc/etc/bash.bashrc、彼らは一般的に設定するための場所をお勧めされていないのでPATH、あなたが実際にこの目的のためにそれらを使用する必要があることはまれです。これらのファイルを使用してディレクトリを追加したPATH場合、それらは時々何度も追加され、調査するとき非常に混乱します$PATH。(極端な場合、これにより速度が低下する可能性がありますが、通常はすべてをきれいに理解しやすくするだけです。)

以来bash、ユーザーのためのUbuntuのデフォルトのログインシェルで、ほとんどのユーザーはそれまたは他のいくつかのPOSIX互換のシェルを使用して、私は環境変数がのような他の非ボーンスタイルのシェルに設定されているかについての情報を省略しましたtcsh


1
[コメント#1/2]この詳細な説明に感謝します!(私はマイナーな編集を行いました。)しかし、私は推奨される方法に関して疑問があります。数年前、EnvironmentVariables 推奨ファイルとして/etc/environment/ ~/.pam_environmentを言及しまし開発者相談した後、PAMと/etc/profile.d/*.sh/の間で中立になるように変更しましたが~/.profile、今でもそのように見ている傾向があります。
グンナルハルマルソン16

1
[コメント#2/2] PAMを支持するいくつかの議論に言及しました。/etc/profile.d/*.sh/ を支持する重要な引数は~/.profile、構文がより単純であり、エラーの場合にlightdm / gdmが寛容であることです(構文エラーでさえログインを妨げることはありませんが、警告メッセージが表示されるだけです)。
グンナルHjalmarsson 16

あなたが言うときpam_env.so、あなたは意味しましたpam_env.confか?
ヨハンブール

@JohanBouléはい、そうでしたpam_env.conf。ありがとう!私はそれを修正するために編集しました。
エリアケイガン

3

/ etc / environmentファイルは、そこでエクスポートを使用できないスクリプトファイルではなく、$ HOMEタイプの変数拡張をサポートしていません。simplevariable= valueペアのみです。そのため、そのファイルを使用するには、単に既存の定義にパスを追加する必要があります。これは、特にシステム全体の環境変数設定用です。1行に1つ。具体的には、このファイルにはシステム全体のロケールとパスの設定が保存されます。

〜/ .profile-このファイルは、bashシェルが実行されるたびに実行されますが、通常は環境変数に推奨されますが、ログインシェルによってのみ呼び出されるという欠点があるため、有効にするために必要になりますログアウトして再度ログインするには-または少なくとも、新しいログインシェルを起動します。


1

環境変数を設定するための好ましい場所は、いくつかのことによって異なります

  1. コンピューターを使用しているのはあなただけですか:
    • この場合、/etc/environment_unauthorizedアクセスの危険がないため、設定するのに最適な場所になります。
  2. システムが多くの人によって使用されている場合
    • すべての人が変数にアクセスする必要がある場合、場所はになりますが/etc/environment
    • 場合は、個々のユーザーがそれらへのアクセスを選択している必要があり、その後、それぞれに彼らを設定する必要があり~/.profile、それが各ユーザーのホームディレクトリに置かれますので、システムの各ユーザーに関係します。

システムは読み取りの/etc/environment前に読み取り~/.profileます。いいえ連結は発生しないなど、アレックスPが言った最後の割り当てパスのが優先されます。

どのように決定する要因でより詳細な一見のための~/.profileおよび/etc/environment他のそのような場所に出て遊ぶ行くここ、ここで、これらの要因は、あなたがこれらの場所を使用する方法に影響を与えるだろうとして、。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.