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

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

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

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

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

答え1

ここで理解すべき基本的な概念は、PATHが複数の場所で定義できることです。 @demureが彼の答えで説明したようPATH=$PATH:/new/dir次へ追加 /new_dir到着すると$PATH不明なことが判明しました$PATH

ファイルが多すぎる理由の1つは、シェルの概念loginに関連しています。non-loginバラよりここ良いまとめです。以下はbashのマニュアルページからのものです(ハイライト):

bashが--loginオプションを使用して対話型ログインシェルまたは非対話型シェルとして呼び出されると、ファイルが存在する場合は、まず/etc/profileファイルからコマンドを読み取り、実行します。ファイルを読み取ったら、~/.bash_profile、~/.bash_login、~/.profile を順番に探します。、最初の既存および読み取り可能なコマンドからコマンドを読み取り、実行します。この動作は、シェルの起動時に --noprofile オプションを使用して無効にできます。

初めてシステムにログインすると起動します。ログインシェルなので、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端末を開くとインタラクティブシェルにあり、bashrc内容が$PATH


全体的に、あなたが本当に知っておくべきことは$PATH編集できるということです$HOME/.profile

答え2

ホームディレクトリでは.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

どこ

  • $PATHPATHに設定されているすべての項目を保持します。
  • :別のアイテム。
  • :/some/other/pathこれら2つのディレクトリは例です(該当するものは必要ありません)。

/etc/bashrc直接変更する必要がある場合は、システム全体の編集をお勧めしません。

答え3

まず、カーネル(またはinitramfs)は、プロセスに初期デフォルトのPATH値initと他の環境変数を提供します。必要に応じてその内容を表示できます。

$ 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を適用するか、単にカーネルデフォルトを渡すことができます。これは設定可能または不可能です。初期化システムのマニュアルを参照してください。

ログインセッションの場合、PAM設定には、pam_env.soユーザーセッションへのデフォルトパスを適用できるエントリを含めることができます/etc/security/pam_env.conf。または、使用されていない場合は、ログインを処理するプロセス(既存のペアなど)pam_env.soコンソールまたはシリアルポートログインなど、ユーザーセッションに独自のデフォルトの開始パスを適用できます。sshd*gettylogin

その後、ユーザーのシェルは通常、1つ以上のシステム全体のログインスクリプトと1つ以上のユーザー固有のログインスクリプト(存在する場合)を実行します。これらのいずれかを既存のPATH設定に追加するか、完全に置き換えることができます。

答え4

PATH私の使用/etc/enviromentのために/etc/login.defs

...

関連情報