.bashrcと.bash_profileの違い

Sep 02 2010

違いは何だ.bashrc.bash_profile、もう1つは、私が使用する必要がありますか?

回答

567 Gilles'SO-stopbeingevil' Sep 03 2010 at 02:23

従来、Unixシステムにログインすると、システムは1つのプログラムを起動します。そのプログラムはシェル、つまり他のプログラムを起動するように設計されたプログラムです。これはコマンドラインシェルです。名前を入力して別のプログラムを起動します。デフォルトのシェルであるBourneシェル~/.profileは、ログインシェルとして呼び出されたときからコマンドを読み取ります。

BashはBourneのようなシェルです。~/.bash_profileログインシェルとして呼び出されたときからコマンドを読み取り、そのファイルが存在しない場合¹、~/.profile代わりに読み取りを試みます。

たとえば、GUI環境内でターミナルエミュレータを起動することにより、いつでもシェルを直接呼び出すことができます。シェルがログインシェルでない場合、読み取りは行われません~/.profile。インタラクティブシェルとして(つまり、スクリプトを実行しないように)bashを起動すると、読み取りが行われます~/.bashrc(ログインシェルとして呼び出された場合を除き、~/.bash_profileまたはを読み取るだけです~/.profile

したがって:

  • ~/.profile ログイン時に開始するプログラム(グラフィカルプログラムではなく、別のファイルに移動します)や環境変数の定義など、セッション全体に適用されるものを配置する場所です。

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

  • ~/.bash_profileの代わりに使用できますが~/.profile、他のシェルではなく、bashによってのみ読み取られます。(これは、初期化ファイルを複数のマシンで機能させ、ログインシェルがそれらすべてでbashされない場合に主に懸念されます。)これは~/.bashrc、シェルがインタラクティブである場合に含める論理的な場所です。次の内容をお勧めします~/.bash_profile

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

現代のユニスでは、に関連する追加の複雑さがあり~/.profileます。グラフィック環境でログインする場合(つまり、パスワードを入力するプログラムがグラフィックモードで実行されている場合)、を読み取るログインシェルを自動的に取得することはありません~/.profile。グラフィカルログインプログラム、後で実行するウィンドウマネージャーまたはデスクトップ環境、およびディストリビューションがこれらのプログラムをどのように構成した~/.profileかによって、が読み取られる場合と読み取られない場合があります。そうでない場合は、通常、ログイン時に起動する環境変数とプログラムを定義できる別の場所がありますが、残念ながら標準の場所はありません。

環境変数の定義~/.bashrcをターミナルに配置するか、常にログインシェルを起動するための推奨事項が、あちこちで見られる場合があることに注意してください。どちらも悪い考えです。これらのアイデアのいずれかで最も一般的な問題は、環境変数が端末から起動されたプログラムにのみ設定され、アイコン、メニュー、またはキーボードショートカットで直接起動されたプログラムには設定されないことです。

¹完全を期すために、リクエストにより:.bash_profile存在しない場合、bashもに.bash_loginフォールバックする前に試行し.profileます。それが存在することを忘れないでください。

58 Jarvin Sep 02 2010 at 21:54

この短い記事から

bashのマニュアルページによると、.bash_profileはログインシェルに対して実行され、.bashrcはインタラクティブな非ログインシェルに対して実行されます。

ログインシェルまたは非ログインシェルとは何ですか?

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

ただし、すでにマシンにログインしていて、GnomeまたはKDE内で新しいターミナルウィンドウ(xterm)を開いている場合は、ウィンドウコマンドプロンプトの前に.bashrcが実行されます。.bashrcは、ターミナルで/ bin / bashと入力して新しいbashインスタンスを開始するときにも実行されます。

40 RichHomolka Sep 03 2010 at 01:10

昔は、疑似ttyは疑似ではなく、実際には入力されていて、UNIXはモデムからアクセスされていたため、各文字が画面に印刷されるのが遅いため、効率が最優先されていました。効率をいくらか助けるために、メインログインウィンドウと、実際に機能していた他のウィンドウの概念がありました。メインウィンドウで、新着メールへの通知が必要です。バックグラウンドで他のプログラムを実行することもできます。

これをサポートするために、シェルは.profile特に「ログインシェル」でファイルを調達しました。これは、セッションのセットアップが完了すると、特別なことを行います。Bashはこれをいくらか拡張して、.profileの前に最初に.bash_profileを確認しました。これにより、bashのみをそこに配置できます(したがって、.profileも確認したBourneシェルなどを台無しにすることはありません)。ログインしていない他のシェルは、rcファイル.bashrc(または.kshrcなど)をソースするだけです。

これは今では少し時代錯誤です。GUIウィンドウマネージャーにログインするほど、メインシェルにはログインしません。他のウィンドウと異なるメインウィンドウはありません。

私の提案-この違いについて心配する必要はありません。これは、unixを使用する古いスタイルに基づいています。ファイルの違いをなくします。.bash_profileの内容全体は次のようになります。

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

そして、実際に設定したいものすべてを.bashrcに入れます

.bashrcは、インタラクティブおよび非インタラクティブのすべてのシェルから供給されることに注意してください。このコードを.bashrcの先頭近くに配置することで、非対話型シェルのソーシングを短絡できます。

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

20 Flimm Jul 13 2016 at 15:53

ShreevatsaRによるこの優れたブログ投稿をご覧ください。これは抜粋ですが、ブログ投稿にアクセスしてください。「ログインシェル」などの用語の説明、フローチャート、および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      |           |      |
+----------------+-----------+-----------+------+
7 Ellipticalview Oct 19 2016 at 01:13

/ 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)

そして、それを参照するために他の各セットアップファイルの先頭にあるこのメモ:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

注目に値するのは、Debianは/etc/profileデフォルトでソース(含む)/etc/bash.bashrcである(それ/etc/bash.bashrcが存在する場合)ということです。したがって、ログインスクリプトは両方の/etcファイルを読み取りますが、非ログインスクリプトはbash.bashrcのみを読み取ります。

また、/etc/bash.bashrcインタラクティブに実行されていない場合は何もしないように設定されていることにも注意してください。したがって、これら2つのファイルはインタラクティブスクリプト専用です。

5 MarcH Jun 25 2019 at 05:55

bash自体の構成ロジックはそれほど複雑ではなく、このページの他の回答、serverfault、および多くのブログで説明されています。ただし、問題はLinuxディストリビューションがbash何を作成するかです。つまり、デフォルトでbashを構成する複雑でさまざまな方法です。http://mywiki.wooledge.org/DotFilesこれらの癖のいくつかに簡単に言及します。これはFedora29の1つのサンプルトレースです。これは、非常に単純なシナリオ(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テストは次のとおりです。

  • ログインシェルから供給されていますが、
  • インタラクティブシェルから供給されていますが、
  • すでに調達されています

...そしてそれらに応じて完全に異なることをします。

上記のグラフを思い出すことができると思う場合は、それだけでは不十分であるため、あまりにも悪いです。このグラフは1つのシナリオのみを説明しているだけで、非対話型スクリプトの実行時またはグラフィカルセッションの開始時にわずかに異なることが起こります。省略しました~/.profilebash_completionスクリプトを省略しました。下位互換性の理由から、/bin/sh代わりにbashを呼び出すと、/bin/bashその動作が変更されます。zshやその他のシェルはどうですか?そしてもちろん、Linuxディストリビューションが異なれば、動作も異なります。たとえば、DebianとUbuntuには非標準バージョンのbas hが付属しており、Debian固有のカスタマイズがあります。特に、異常なファイルを探します/etc/bash.bashrc。単一のLinuxディストリビューションに固執したとしても、おそらく時間の経過とともに進化します。待ってください:macOS、FreeBSDなどには触れていません...最後に、管理者が使用する必要のあるシステムを構成するさらに創造的な方法に固執しているユーザーについて考えてみましょう。

このトピックに関する議論の終わりのない流れが示すように、それは失われた原因です。新しい値を追加したいだけであれば、「試行錯誤」で十分な傾向があります。本当の楽しみは、ある(ユーザー)ファイルで、別の(/ etcで)すでに定義されているものを変更したいときに始まります。次に、移植性のないソリューションのエンジニアリングに時間を費やす準備をします。

最後の楽しみとして、2019年6月現在のClearLinuxでの同じ単純なシナリオの「ソースグラフ」を次に示します。

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