web-dev-qa-db-ja.com

Linuxでパス環境変数はどのように機能しますか?

LinuxでPATH環境変数がどのように機能するか混乱しています。私はLinux Mint 15のユーザーです。

まず、/home/.bashrcファイルの編集とPATH=$PATH:/directoryの実行について読みました。
しかし、私は/etc/bash.bashrcで管理されるパスについても知っていました
したがって、/usr/local/binにインストールされているすべてのソフトウェアは、シェルのどこからでもアクセスできます。

Linuxではパス変数はどのように機能し、どこに配置する必要がありますか?

7
diegoaguilar

ここで把握する基本的な考え方は、PATHは多くの場所で定義できるということです。 @demureが彼の回答で説明しているように、PATH=$PATH:/new/diradd/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に変更を加えることができるということだけを知っておく必要があります。

9
terdon

ホームディレクトリでは、.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にすでに設定されているものをすべて保持します。
  • :はエントリを区切ります。
  • 2つのディレクトリは例です(:/some/other/pathの部分は必要ありません)

自分だけの変更が必要な場合は、システム全体を編集することはお勧めしません/etc/bashrc

3
demure

まず最初に、カーネル(または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設定に追加するか、完全に置き換えることができます。

0
telcoM