web-dev-qa-db-ja.com

PATH変数がbashで設定されている場所の完全なビュー

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~/.profilePATHのみのファイル設定である場合、$PATHは、/etc/profileで定義されていない場合、そのコード行から取得されます。

経験豊富な人がPATH変数について幅広く詳細な説明をしていただけますか?ありがとう!

18
Larry Lawless

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 /ディストリビューションによって異なります。

3

見えないもの:

  • Xのもの
  • Masterfiles from .profileなどはアカウント作成時にコピーされます
  • pam_env
  • Debian に関する最近のスレッド。これについては、詳しく説明しています。

ケン・トンプソンについては、彼に驚くかもしれません: "Linuxのビュー"

0
Rusi