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


16

PATHが設定されているいくつかの場所、/etc/profileまたは.profileホームディレクトリにあるファイルを読みました。

これらはパスが設定されている唯一の場所ですか?私はそれをより良く理解したいです。

/etc/profile、ファイル、次のコメントが言うように"system-wide .profile file for the Bourne shell"。それは、プロファイルファイルがbashの主要な構成ファイルであることを意味しますか?

そのファイルでは、PATH変数がまったく設定されていません。で.profile、ホームディレクトリ内のファイルの行があります:

PATH="$HOME/bin:$PATH"

それPATHは既に設定された$PATH文字列を$HOME/bin:右に連結しているので、見た目でリセットしていますか?しかし、もしetc/profileおよび~/.profile設定ファイルだけですPATHされた場合$PATH、それはで定義されていない場合はそのコード行でから来ますか/etc/profile

誰かがPATH変数の広範かつ詳細な説明をお願いします。ありがとう!

回答:


19

多くの場所があります PATH設定できる。

loginプログラムは、デフォルト値に設定します。このデフォルト値の設定方法はシステムに依存します。ほとんどの非組み込みLinuxシステムでは、/etc/login.defsルートと他のユーザーに対して異なる値を使用して、から取得されます。login(1)システムのマニュアルを参照して、その機能を確認してください。

PAM、特にpam_envモジュールを使用するシステムでは、環境変数をシステム全体のファイルに設定できます/etc/environmentとユーザーごとのできます~/.pam_environment

次に、(cronジョブではなく)ログインするほとんどの方法で、システム全体のユーザーごとの構成ファイルを読み取るログインシェルを実行します。これらのファイルはの値を変更して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、これはデスクトップ環境や他のセッションの起動スクリプト、およびどのようにそれぞれの分布はこれらのセットアップを設定した上で、ディスプレイマネージャに依存します。


4

通常、初期PATH変数は /etc/profile 管理者は、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_profileと.cshrcは存在しません。/etc/profile.dディレクトリ内の3つのスクリプトファイル:appmenu-qt5.sh、bash_completion.shおよびvte.shは、PATH変数も設定しません。「シェルにも環境変数があります」とは、バイナリの/ bin / bashプログラムに設定されているデフォルトのPATHを意味しますか?端末に$ PATHをエコーすると、/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / games:/ usr / local / gamesが取得されますしかし、私はそれが本当にどこに設定されているのかわからない。
ラリーローレス

私はあなたの質問を多少誤解していると思います、あなたはPATHが設定できるすべての場所を求めていると思いましたが、あなたはPATHが最初に設定されている場所にもっと興味があると思います。それについては、をご覧ください/etc/bashrc。これにより、すべての初期環境変数が含まれるBASHの起動方法が決まります。私のシステムでは、/etc/bashrcから読み取り/etc/profile.dますが、3つのファイルしか入っていないように聞こえる/etc/profile.dので、ディストリビューションが異なる方法で処理している可能性があります。
クラトゥフォンシュラッカー

1
私は基本的に、その中身を知りたいです。ケントンプソンが私の父であったことを願っています:)
ラリーローレス

そこに着きます。私を信じてください、あなたがしばらくの間毎日これらのものを使用した後、すべてが沈み始めます、そしてあなたが「なぜ?」と尋ね続ける限り。答えのドキュメントを読んで、最終的に多くを学びます!
クラトゥフォンシュラッカー

Linux Mint 18 Cinnamonでは、必ず/etc/profile.d/jdk_home.shを確認してください。このファイルの名前をjdk_home.sh.oldに変更すると、パスが上書きされなくなり、java -versionを呼び出してJava 9を表示できます。期待された。私は正しく--config javaのこのjdk_home.shファイルが$ PATHをオーバーライドまま更新aternativesでJava 9を選択したにもかかわらず
flyingdrifter

3

他の回答に追加するには:

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.