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/環境変数
答え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/environment
。gksudo gedit /etc/environment
/etc/environment
は、変数の古い値を自動的に含めることをサポートしていません。しかし、ほとんどの場合、 を編集してすべてのユーザーの環境変数を設定するため/etc/environment
、ユーザーがログインしたときにその初期値を設定することになるため、これは通常不要です。その後、ユーザーは好きなように変更できます。通常、ユーザーがこれを実行できることは良いことです。
2. すべてのユーザーの場合:/etc/security/pam_env.conf
/etc/security/pam_env.conf
PAM は、ユーザーごとのファイルで使用されるのと同じ構文で指定されたからすべてのユーザーの環境変数を読み取ります~/.pam_environment
(以下を参照)。
と の両方に同じ環境変数が設定されている場合/etc/environment
、ではなく としてその値が指定されていても、/etc/security/pam_env.conf
の値pam_env.conf
が使用されます。DEFAULT
OVERRIDE
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_environment
pam_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_environment
PATH
.profile
PATH
.pam_environment
PATH
たとえば、.profile
Ubuntuのデフォルトのユーザーごとのファイル慣れている最後に:
# 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 は読み取りません。
システム全体
/etc/profile
- 直接編集するのは得策ではありません。
/etc/profile.d/*.sh
- 出典:/etc/profile
セッション全体
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh