LinuxでPATH環境変数がどのように機能するか混乱しています。私はLinux Mint 15のユーザーです。
まず、/home/.bashrc
ファイルの編集とPATH=$PATH:/directory
の実行について読みました。
しかし、私は/etc/bash.bashrc
で管理されるパスについても知っていました
したがって、/usr/local/bin
にインストールされているすべてのソフトウェアは、シェルのどこからでもアクセスできます。
Linuxではパス変数はどのように機能し、どこに配置する必要がありますか?
ここで把握する基本的な考え方は、PATHは多くの場所で定義できるということです。 @demureが彼の回答で説明しているように、PATH=$PATH:/new/dir
はadd/new_dir
to $PATH
を意味し、元の$PATH
をクリアしません。
現在、多くのファイルがある理由の1つは、login
およびnon-login
シェルの概念と密接に関連しています。すてきな要約については here を参照してください。以下はbashのmanページからのものです(強調は私のものです):
Bashがインタラクティブログインシェルとして、または--loginオプションを使用した非インタラクティブシェルとして呼び出されると、/ etc/profileファイルからコマンドを最初に読み取り、実行します存在します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、〜/ .profileをこの順序で検索し、存在している最初のコマンドからコマンドを読み取って実行します読みやすい。シェルの起動時に--noprofileオプションを使用して、この動作を禁止できます。
システムに初めてログインするときに、loginシェルを起動して、bashが上記のファイルを読み取るようにします。ほとんどのディストリビューションでは、システム全体の$PATH
(これはすべてのユーザーに適用されます)を/etc/profile
に設定しており、ここですべてのユーザーに適用したい変更を行う必要があります。これは私が私のDebianに持っているものです:
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
ログインした後、ターミナルを開くと、対話型の非ログインシェルが起動します。これは、man bash
がそれらについて述べなければならないことです。
When an interactive Shell that is not a login Shell
is started, bash reads and executes commands from
/etc/bash.bashrc and ~/.bashrc, if these files exist.
したがって、これらのファイルは、新しいターミナルを開くたびに読み取られます。フィルナル$ PATHは、すべてのファイルの値の組み合わせです。一般的な状況では、グラフィカルログインマネージャーを使用してログインし、新しいセッションを開始します。この時点で、$PATH
はさまざまなprofile
ファイルで定義されたものです。ターミナルを開くと、対話型シェルになり、$PATH
に追加される可能性のあるさまざまなbashrc
ファイルが読み取られます。
要約すると、$PATH
を編集してユーザーの$HOME/.profile
に変更を加えることができるということだけを知っておく必要があります。
ホームディレクトリでは、.bashrc
ではなく.bash.rc
になります。
システム全体の構成は/etc/bashrc
ではなく/etc/.bash.rc
です。
Unixとlinuxは\some\path\here
ファイルパスを使用せず、/some/path/here
ファイルパスを使用します。 \
はエスケープ文字であり、他の特殊文字を無効にするために使用されます。
これらを$PATH
の行に追加することにより、~/.bashrc
を編集できます(~
はホームディレクトリを意味します)
PATH=$PATH:/usr/local/bin:/some/other/path
export PATH
どこ
$PATH
は、PATHにすでに設定されているものをすべて保持します。:
はエントリを区切ります。:/some/other/path
の部分は必要ありません)自分だけの変更が必要な場合は、システム全体を編集することはお勧めしません/etc/bashrc
。
まず最初に、カーネル(またはinitramfs)は、init
プロセスの初期デフォルトPATH値と、いくつかの他の環境変数を提供します。必要に応じて、それらを表示できます。
$ Sudo strings /proc/1/environ
selinux=0
SHLVL=1
HOME=/
init=/sbin/init
TERM=linux
drop_caps=
BOOT_IMAGE=/vmlinuz-4.9.80-atom
PATH=/sbin:/usr/sbin:/bin:/usr/bin
crashkernel=384M-:128M
PWD=/
rootmnt=/root
起動時に開始されるデーモンおよびその他のプロセスの場合、init
プロセス(従来のSysVinitまたはsystemd
のような新しい置換のいずれか)は、独自のデフォルトPATHを適用するか、単にカーネルのデフォルト値。これは設定可能かもしれませんし、そうでないかもしれません:あなたのinitシステムのドキュメントを見てください。
ログインセッションの場合、PAM設定にはpam_env.so
は、ユーザーセッションにデフォルトのPATHを適用でき、/etc/security/pam_env.conf
。またはpam_env.so
は使用されていません。ログインを処理するプロセス(例:sshd
、または従来の*getty
+ login
ペア(コンソールまたはシリアルポートログイン)では、ユーザーセッションに対して独自のデフォルトの開始PATHが適用される場合があります。
次に、ユーザーのシェルは通常、1つ以上のシステム全体のログインスクリプトと、存在する場合は1つ以上のユーザー固有のログインスクリプトを実行します。これらはいずれも、既存のPATH設定に追加するか、完全に置き換えることができます。