PATH
が/etc/profile
またはホームディレクトリにある.profile
ファイルに設定されている場所をいくつか読んだことがあります。
パスが設定されているのはこれらだけですか?私はそれについてもっと理解したいです。
/etc/profile
ファイルでは、次のコメントに"system-wide .profile file for the Bourne Shell"
と記載されています。それは、プロファイルファイルがbashのメイン構成ファイルであることを意味しますか?
そのファイルには、PATH
varが設定されているのがまったくわかりません。ホームディレクトリの.profile
ファイルには、次の行があります。
PATH="$HOME/bin:$PATH"
既に設定されている$PATH
文字列と$HOME/bin:
を連結しているため、これは外観によってPATH
をリセットしていますか?ただし、etc/profile
と~/.profile
がPATH
のみのファイル設定である場合、$PATH
は、/etc/profile
で定義されていない場合、そのコード行から取得されます。
経験豊富な人がPATH
変数について幅広く詳細な説明をしていただけますか?ありがとう!
PATH
を設定できる場所はたくさんあります。
login
プログラムは、これをデフォルト値に設定します。このデフォルト値の構成方法はシステムに依存します。ほとんどの非組み込みLinuxシステムでは、ルートと他のユーザーの値が異なる _/etc/login.defs
_ から取得されます。システムのlogin(1)
マニュアルを参照して、機能を確認してください。
[〜#〜] pam [〜#〜] 、具体的には _pam_env
_ モジュールを使用するシステムでは、環境変数をシステム全体のファイルに設定できます_/etc/environment
_およびユーザーごとのファイル_~/.pam_environment
_。
次に、(cronジョブではなく)ログインするほとんどの方法で login Shell を実行し、システム全体およびユーザーごとの構成ファイルを読み取ります。これらのファイルはPATH
の値を変更し、通常はエントリを追加しますが、他の方法で変更することもあります。読み込まれるファイルは、ログインシェルが何であるかによって異なります。 Bourne/POSIXスタイルのシェルは_/etc/profile
_および_~/.profile
_を読み取ります。 Bashは_/etc/profile
_を読み取りますが、ユーザーごとのファイルの場合、_~/.bash_profile
_、_~/.bash_login
_、および_~/.profile
_のうち最初の既存のファイルのみを読み取ります。 Zshは_/etc/zshenv
_、_~/.zshenv
_、_/etc/zprofile
_、_~/.zprofile
_、_/etc/zlogin
_および_~/.zlogin
_を読み取ります。多くのGUIセッションは_/etc/profile
_および_~/.profile
_をロードするように調整しますが、これはディスプレイマネージャー、デスクトップ環境または他のセッション起動スクリプト、および各ディストリビューションがこれらをどのように設定したかに依存します。
通常、初期PATH変数は/etc/profile
に設定されます。sys管理者は、PATH変数を/etc/profile.d
これらは、ローカルで上書きされない限り、ログインするすべてのユーザーがデフォルトで継承するシステムPATH変数です。これは通常、/usr/bin
のような明白なパスを設定しますが、私の仕事では/opt
といくつかのカスタムの場所を広範囲に使用するため、それらもそこに設定されます。
ユーザーごとのログインベースのアカウントでは、PATHも~/.profile
で定義できます。それは、すべてのユーザーがアクセスできるわけではないことを定義するかもしれません。多分部門長は/opt
からバイナリを実行できますが、他のユーザーはそれらのバイナリに悩まされることはありません。ユーザーもそのファイルを自分で変更できます。.profile
のいいところは、シェル固有ではないということです。ログインすると、そこに設定されているPATHが読み込まれます。
シェル固有のログインの場合、PATHは~/.bash_profile
、~/.bashrc
、.cshrc
などで定義できます。ユーザーは、特定のシェルの特定のパスが必要な場合、またはたまたますべての個人設定をそこで維持する場合に、ここでPATHを設定できます。
要約すると、/ etc/profileと/etc/profile.dは伝統的にカスケード設定です。それらは継承され、通常は個人のドットファイルに追加されます(ユーザーが代わりにそれらを上書きすることを選択できます)。個人のドットファイルは通常、ユーザーによって設定されます。
もちろん、シェルにも環境変数があるため、ローカル環境変数を使用して、構成ファイルのデフォルトのPATHを追加またはオーバーライドすることもできます。
他の回答に追加するには:
bash
は、環境で設定されていない場合、PATH
をハードコードされたデフォルト値に設定します。 Ubuntu Server 16.04.2マシンでは、次のようになります。
$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
strings
ユーティリティを使用して、この値が実際にハードコードされており、環境または一部のファイルから読み取られていないことを確認できます。
$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
ただし、Arch Linuxマシンでは別の結果が得られます。
$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin
したがって、bash
バイナリがビルドされたときにこのデフォルトが選択されているように見えます。これは、使用しているOS /ディストリビューションによって異なります。
見えないもの:
.profile
などはアカウント作成時にコピーされますケン・トンプソンについては、彼に驚くかもしれません: "Linuxのビュー" 。