2010-09-02 14:40:34 +0000 2010-09-02 14:40:34 +0000
453
453

.bashrc と .bash_profile の違い

.bashrc.bash_profileの違いは何か、どちらを使えばいいのか?

回答 (6)

528
528
528
2010-09-02 19:23:14 +0000

伝統的に、Unix システムにログインすると、システムはあなたのために一つのプログラムを起動します。そのプログラムはシェル、つまり他のプログラムを起動するように設計されたプログラムです。これはコマンドラインシェルで、名前を入力することで別のプログラムを起動します。デフォルトのシェルであるボーンシェルは、ログインシェルとして起動されると、~/.profile からコマンドを読み込みます。

Bash はボーン系シェルです。ログインシェルとして起動されると ~/.bash_profile からコマンドを読み込み、そのファイルが存在しない場合¹、代わりに ~/.profile を読み込もうとします。

GUI環境内でターミナルエミュレータを起動するなど、いつでも直接シェルを呼び出すことができます。そのシェルがログインシェルでない場合は、~/.profileを読み込まない。対話型シェルとして(つまりスクリプトを実行するためではなく)bashを起動すると、~/.bashrcを読みます(ログインシェルとして起動した場合を除く)。

  • ~/.bash_profile はセッション全体に適用されるもの、例えば、ログイン時に起動したいプログラム(ただし、グラフィカルプログラムは別のファイルに入る)や環境変数の定義などを置く場所です。

  • ~/.profile は、エイリアスや関数の定義、シェルオプション、プロンプトの設定など、bash 自体にのみ適用されるものを置く場所です。(ここにキーバインディングを置くこともできますが、bash の場合は通常 ~/.profile に入ります)

  • ~/.bashrc の代わりに ~/.inputrc を使用することもできますが、これは bash でのみ読み込まれ、他のシェルでは読み込まれません。(これは、初期化ファイルを複数のマシンで動作させたい場合や、ログインシェルがすべてのマシンで bash を使用していない場合には、ほとんどの場合に問題となります)。シェルが対話的な場合、これは ~/.bash_profile を含める論理的な場所です。~/.profile には以下の内容を入れることをお勧めします。

最近の unices では、~/.bashrc に関連してさらに複雑な問題があります。グラフィカルな環境でログインした場合(つまり、パスワードを入力するプログラムがグラフィックモードで動作している場合)、自動的に ~/.bash_profile を読むログインシェルが表示されるわけではありません。グラフィカルなログインプログラム、その後に実行するウィンドウマネージャやデスクトップ環境、ディストリビューションの設定方法によっては、~/.profileが読み込まれる場合と読み込まれない場合があります。読まれない場合は、通常は別の場所に環境変数やログイン時に起動するプログラムを定義できる場所がありますが、残念ながら標準的な場所はありません。

環境変数の定義を~/.profileに入れるか、ログインシェルを常に端末で起動するように推奨しているのをあちこちで目にすることがあるので注意してください。どちらも良くない考えです。どちらの方法でも最も一般的な問題は、環境変数が設定されるのはターミナル経由で起動されたプログラムの中だけであり、アイコンやメニュー、キーボードショートカットで直接起動されたプログラムの中では設定されないということです。

¹ 完全性のために、要望により: ~/.profile が存在しない場合、bash も ~/.bashrc に戻る前に .bash_profile を試します。.bash_login が存在しない場合、bash は .profile を試してから 0x6& に戻るようにします。

54
54
54
2010-09-02 14:54:04 +0000

この [ 短い記事 ]より (http://joshstaiger.org/archives/2005/07/bash_profile_vs.html)

bash の man ページによると、ログインシェルには .bash_profile が実行され、インタラクティブな非ログインシェルには .bashrc が実行されるとのことです。

*What is a login or non-login shell? *

コンソール経由でログイン(例: ユーザ名とパスワードを入力)する場合、起動時に物理的にマシンの前に座っているか、または ssh 経由でリモートでログインする場合: .bash_profile が実行され、最初のコマンドプロンプトの前に設定を行います。

しかし、すでにマシンにログインしていて、Gnome や KDE で新しいターミナルウィンドウ (xterm) を開いている場合は、ウィンドウのコマンドプロンプトの前に .bashrc が実行されます。

35
35
35
2010-09-02 18:10:20 +0000

昔、疑似 tty が疑似的なものではなく、実際には、まあ、タイプされたものであり、UNIX にはモデムでアクセスしていたので、一文字一文字が画面に印刷されているのを見ることができるほど遅かった時代には、効率性が最優先されていました。効率化のために、メインのログインウィンドウと、実際に作業をするための他のウィンドウという概念がありました。メインウィンドウでは、新しいメールの通知や、バックグラウンドで他のプログラムを実行することができるようにしました。

これをサポートするために、シェルは特に ‘login shells’ にあるファイル .profile をソースにしました。これは特別な、セッションに一度だけのセットアップを行います。Bash はこれを拡張して、.profile の前に .bash_profile を最初に見るようにしました。この方法では bash だけのものを入れることができます (Bourne シェルなども .profile を見るようになっています)。ログインしていない他のシェルは、rc ファイルである .bashrc (または .kshrc など) をソースにするだけです。

これは今となっては時代錯誤です。gui ウィンドウマネージャにログインするのと同じように、メインシェルにログインすることはありません。他のウィンドウと何ら変わらないメインウィンドウはありません。

私の提案 - この違いを気にしないでください。あなたのファイルの違いを排除してください。.bash_profile の内容全体は、以下のようになるはずです。

[-f $HOME/.bashrc] && . $HOME/.bashrc

そして、実際に設定したいものはすべて .bashrc

に入れてください。.bashrc の先頭付近に以下のコードを記述することで、非インタラクティブなシェルのソースをショートさせることができます:

[[$- != *i*]] && return

19
19
19
2016-07-13 08:53:44 +0000

これを見てみてください ShreevatsaRによる優れたブログ記事 . ここでは抜粋していますが、ブログ記事に行くと、"login shell “のような用語の説明、フローチャート、Zshの同様の表が含まれています。

Bashの場合、以下のように動作します。適当な列を読み下ろす。A、次にB、次にCなどを実行する。B1,B2,B3は、見つかったファイルの最初のものだけを実行することを意味します。

+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
5
5
5
2016-10-18 18:13:24 +0000

/ETC/PROFILE の先頭により良いコメント*

上記の Flimm さんの素晴らしい回答を基に、私は Debian の /etc/profile の先頭に以下の新しいコメントを挿入しました。

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found. (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# | | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# | | login | non-login |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | ALL USERS: | | | |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV | | | A | not interactive or login
# | | | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile | A | | | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc | (A) | A | | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh| (A) | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh | (A) | | | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh | (A) | | |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | A SPECIFIC USER: | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile (bash only) | B1 | | | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login (bash only) | B2 | | | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile (all shells) | B3 | | | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc (bash only) | (B2) | B | | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# | | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout | C | | |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

注目すべき点は、Debian の /etc/profile はデフォルトで /etc/bash.bashrc をソース (インクルード) していることだと思います (これは /etc/bash.bashrc が存在する場合の話です)。つまり、ログインスクリプトは両方の /etc ファイルを読み、非ログインは bash.bashrc だけを読みます。

また、/etc/bash.bashrc は対話的に実行されていないときは何もしないように設定されています。つまり、この2つのファイルは対話型スクリプトのためだけにあるということです。

4
4
4
2019-06-24 22:55:40 +0000

bashの設定ロジック自体は非常に複雑なものではなく、このページの他の回答、serverfaultや多くのブログで説明されています。しかし、問題は what the Linux distributions make of bash、つまり、デフォルトでbashを設定する複雑で様々な方法です。 http://mywiki.wooledge.org/DotFiles は、これらの奇妙な点について簡単に言及しています。これは、Fedora 29 のサンプルトレースで、リモートで ssh で接続してから別のサブシェルを起動するという非常に単純なシナリオで、どのファイルがどのファイルのソースで、どの順番で他のファイルを起動しているかを示しています:

ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      | ├─ /etc/profile.d/*.sh
      | ├─ /etc/profile.d/sh.local
      | └─ /etc/bashrc
      ├── ~/.bash_profile
      | └─ ~/.bashrc
      | └─ /etc/bashrc
      |
      |
      └─ $ bash # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh

Fedora の最も複雑なロジックは /etc/bashrc にあります。上で見たように、/etc/bashrc は bash 自体が知らないファイルです。Fedoraの/etc/bashrcは.

  • ログインシェルからソースを取得しているか、
  • 対話型シェルからソースを取得しているか、
  • 既にソースを取得しているか

… そして、それらに応じて全く異なる動作をします。

上のグラフを覚えていると思っているなら、それは残念です。~/.profileは省略しました。bash_completion スクリプトは省略しています。下位互換性の理由から、bash を /bin/sh の代わりに /bin/bash として起動すると挙動が変わります。zsh や他のシェルはどうでしょうか?そしてもちろん、Linuxディストリビューションによって動作は異なります。例えば、DebianとUbuntuには非標準バージョンのbas_hが付属していますが、Debian固有のカスタマイズが施されています。特に変わったファイルを探しています。/etc/bash.bashrc. 単一の Linux ディストリビューションに固執していても、おそらく時間の経過とともに進化していくでしょう。待ってください: 私たちはまだ macOS, FreeBSD, にも触れていません。最後に、管理者が使用しなければならないシステムをさらに創造的な方法で設定していることに行き詰っているユーザのために考えてみましょう。

このトピックに関する議論の終わりのない流れが示しているように、この問題は迷走しています。新しい値を追加したいだけであれば、「試行錯誤」で十分な傾向があります。本当の楽しみは、ある(ユーザ)ファイルの中で、既に別の(/etc)ファイルで定義されているものを modify したい時から始まります。その時には、決して移植性のないソリューションを設計するのに時間を費やす覚悟をしておいてください。

最後の楽しみとして、2019年6月現在のClear Linux上の同じ、単純なシナリオの「ソースグラフ」を以下に示します:

ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      | ├─ /usr/share/defaults/etc/profile.d/*
      | ├─ /etc/profile.d/*
      | └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─ $ bash # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           | ├─ /usr/share/defaults/etc/profile
           | | ├─ /usr/share/defaults/etc/profile.d/*
           | | ├─ /etc/profile.d/*
           | | └─ /etc/profile
           | └─ /etc/profile
           └─ ~/.bashrc