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

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

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

~/.profileまたは/etc/environment

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

答え1

まとめ:

  • /your/additional/pathコンピュータのすべてのユーザーではなく、現在のユーザーのみの変数にパス (例 )を追加する場合は、通常、次の 2 つの例のいずれかのように、パスPATHを の末尾に追加します。~/.profile

    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変数に追加するなどの内容が含まれています (16.04 より前の古い Ubuntu リリースでは無条件に追加され、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/環境変数


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

答え2

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

設置場所の好みPATHは、どのユーザー設定する必要がありますいつ、どのように設定したい環境変数を指定します。決定事項の 1 つは、環境変数をすべてのユーザーに設定するか、ユーザーごとに設定するかです。よくわからない場合は、システム全体ではなく、1 人のユーザー (たとえば、自分のアカウント) のみに設定することをお勧めします。

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

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

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

一般的な設定場所は、PATHユーザーがログインしたときに有効になる順に以下に記載されています。ない通常使用を検討すべき順序以下に挙げた場所はいずれも設定に適した場所である。PATH いくつかの状況しかし、ほとんどの場合、良い選択肢となるのはほんのわずかです。

以下のリストには、 のようなディレクトリ名がいくつかあります~/.profileチルダ展開は、~/現在のユーザーのホームディレクトリを参照します。私は主に簡潔さのためにこの構文を使用します。シェルスクリプトではサポートされていますが、ないPAM 構成ファイル内。

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

パムUbuntu では、そのファイルが存在する場合 (デフォルトでは存在します)、 にリストされている環境変数が/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一般的です。)

このファイルは、ルート ユーザーとして他のファイルを編集する場合と同じ方法で編集できます ( sudoedit /etc/enviromnment、、など) sudo nano -w /etc/environmentgksudo gedit /etc/environment

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

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

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

と の両方に同じ環境変数が設定されている場合/etc/environment、ではなく としてその値が指定されていても、/etc/security/pam_env.confの値pam_env.confが使用されます。DEFAULTOVERRIDE

environmentただし、の行を の行で置き換える場合は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

見るサブ~/.pam_environmentセクション環境変数(上記の例はこれにかなり近い形で適応されている)、man pam_env、 そしてman pam_env.conf詳細についてはこちらをご覧ください。

これはかつてUbuntuユーザーが環境変数を変更または追加するための好ましい方法として宣伝されており、今でも合理的で許容できる選択肢と考えられていますが、編集するときは注意が必要です.pam_environmentシステム全体の編集/etc/security/pam_env.conf(上記参照)と同様に、ユーザー.pam_environmentファイル内の不正な行はログインの成功を妨げます。(私はこれをテストしました - 今回は意図的に。)方法については推奨事項持っている進化した、 見るグンナー・ヒャルマルソンコメント 下にそしてこのubuntu-devel議論

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

(他のユーザーアカウントがある場合は、別のユーザーとしてログインして問題を解決できます。管理者ではなくsudoルート権限がない場合でも、実行でき、(自分のアカウントではなく)パスワードの入力を求められます。su your-accountゲストsuただし、アカウントは他のユーザーの ID を取得するために使用することは禁止されているため、これを行うことはできません。

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

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

Ubuntu は/etc/profile次のように終わります:

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で新しいファイルを作成する方がよいでしょう。その理由の 1 つは、Ubuntu がアップグレードされると、新しいデフォルト ファイルが存在する可能性があるためです。アップグレードの実行方法に応じて、古いファイル (変更を含む) が保持され、特定の更新された構成ファイルは残されないか、状況に対処するように求められます。/etc/profile.d//etc/profile/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 はまたは の~/.bash_profile代わりにそれを使用します(下記参照)。通常、ホーム ディレクトリに を置くべきではありません。~/.profile~/.bash_login.bash_profile

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

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

ユーザーが を持っている場合~/.bash_login、 が存在しない限り、bash は の代わりに を使用します~/.profile(下記参照) ~/.bash_profile。 が存在する場合、`~/.bash_login から取得されない限り、他のどちらも使用されません。

と同様に、通常はホーム ディレクトリにファイル.bash_profileを置かないでください。.bash_login

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

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

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

と同様に/etc/profile、ほとんどのディスプレイ マネージャーはグラフィカル ログインに対してこのファイルを実行しますが、すべてのディスプレイ マネージャーが実行するわけではありません。~/.pam_environmentこれは環境変数を設定することを優先する理由です(そう/etc/environmentすることを好む人もいるかもしれないが/etc/profile)。

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

たとえば、.profileUbuntuのデフォルトのユーザーごとのファイル慣れている最後に:

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

見るグンナー・ヒャルマルソンコメントの上バイトコマンダーの回答詳細については。

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

そのリストにはいくつかの可能性が抜けています。

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

~/.bashrcやなど、環境変数を定義することがあるいくつかのファイルは省略しました。これらのファイルは/etc/bash.bashrc設定することが一般的に推奨される場所ではなくPATH、実際にこの目的で使用することはまれだからです。これらのファイルを使用して にディレクトリを追加するとPATH、ディレクトリが何度も追加されることがあり、 を調べるときに非常に混乱します$PATH。(極端な場合には処理が遅くなることがありますが、通常はすべてをクリーンでわかりやすい状態に保つことが目的です。)

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

答え3

/etc/環境ファイルはスクリプト ファイルではないので、そこでエクスポートすることはできません。また、$HOME タイプの変数拡張はサポートされておらず、単純な変数 = 値のペアのみをサポートしています。したがって、そのファイルを使用するには、既存の定義にパスを追加するだけで済みます。これは、システム全体の環境変数設定専用です。1 行に 1 つずつ追加します。具体的には、このファイルにはシステム全体のロケールとパスの設定が保存されます。

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

答え4

bash はこれらのファイルを読み取りますが、zsh は読み取りません。

  1. システム全体

    /etc/profile- 直接編集するのは得策ではありません。
    /etc/profile.d/*.sh- 出典:/etc/profile

  2. セッション全体

    ~/.profile

https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh

関連情報