web-dev-qa-db-ja.com

.bashrc、.bash_profile、および.environmentの違いは何ですか?

私は何年もの間、さまざまな* nixベースのシステムを使用してきましたが、使用するBashのすべての種類に、実行する起動スクリプトを決定するためのアルゴリズムが異なるようです。環境変数やエイリアスの設定、起動メッセージ(MOTDなど)の印刷などのタスクのためには、どの起動スクリプトが適していますか?

.bashrc.bash_profile、および.environmentにものを入れることの違いは何ですか? .login.bash_login.profileなどの他のファイルも見ました。これらは関係ありますか?物理的にログインしたとき、sshを介してリモートにログインしたとき、新しい端末ウィンドウを開いたときに実行される違いは何ですか?プラットフォーム間(Mac OS X(およびそのTerminal.app)とCygwin Bashを含む)で大きな違いはありますか?

130
Adam Rosenfield

Shell設定ファイルとの主な違いは、いくつかは "login"シェルによってのみ読み込まれるということです(例えば、あなたが他のホストからログインするとき、またはローカルのunixマシンのテキストコンソールでログインするとき)。これらは.login.profileまたは.zloginと呼ばれるものです(使用しているシェルによって異なります)。

それからあなたは "対話型"シェルによって読み込まれる設定ファイルを持っています(ターミナルに接続されているもの(あるいはウィンドウシステムの下で走っているターミナルエミュレータの場合には疑似ターミナル)のように)。 .bashrc.tcshrc.zshrcなど.

bash.bashrcの両方が interactive および non-login であるという点で、これを複雑にしています。自分の.bash_profileに、.bashrcも次のように読むように指示する

[[ -r ~/.bashrc ]] && . ~/.bashrc

他のシェルは異なった振る舞いをします - 例えばzshの場合、ログインシェルであろうとなかろうと.zshrcは常にインタラクティブなシェルのために読み込まれます。

Bashのマニュアルページは、各ファイルが読み込まれる状況を説明しています。はい、動作は通常マシン間で一貫しています。

.profileは、元々/bin/shによって使用されていたログインスクリプトのファイル名です。 bashは、一般的に/bin/shと後方互換性があり、存在する場合は.profileを読み取ります。

73
Cos

それは簡単です。それはman bashで説明されています:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-Shell startup file
~/.bash_logout
       The individual login Shell cleanup file, executed when a login Shell exits
~/.inputrc
       Individual readline initialization file

ログインシェルはあなたがログインしたものを読むものです(したがって、たとえばxtermを単に起動したときには実行されません)。ログインする方法は他にもあります。たとえばXディスプレイマネージャを使用します。ログイン時に環境変数を読み込んでエクスポートする方法は他にもあります。

マニュアルのINVOCATIONの章も読んでください。それは"次の段落はbashが起動ファイルを実行する方法を説明しています。"、私はそれがスポットオンだと思います:)それは "対話型"シェルも何であるかを説明します。

Bashは.environmentについて知りません。私はそれがあなたが動かしているシェルとは無関係に環境変数を設定するためのあなたのディストリビューションのファイルだと思う。

~/.profileは古典的にはBourne Shellによって使用されており、おそらくBashによってレガシー対策としてサポートされています。繰り返しますが、~/.login~/.cshrcはCシェルによって使用されていました - Bashがそれらをまったく使用しているかどうかはわかりません。

~/.bash_profileはログイン時に一度使用されます。 ~/.bashrcスクリプトはシェルが起動されるたびに読み込まれます。これはCシェルの/.cshrcに似ています。

1つの結果として、~/.bashrcの内容は、非ログインシェルを起動するときのオーバーヘッドを減らすために、できるだけ軽量(最小限)にする必要があります。

~/.environmentファイルはKornシェルの互換ファイルです。

9

まとめると、.bashrcと.bash_profile に関する情報がここにあります

ログイン時に.bash_profileが実行されます。あなたがそこに入れたものはあなたのPATHや他の重要な環境変数かもしれません。

.bashrcは非ログインシェルに使用されます。それがどういう意味かわからない。私はRedHatがあなたが別のシェルを起動するたびにそれを実行することを知っています(このユーザーにsuを押すか、あるいは単にbashを再度呼び出す)あなたはそこにエイリアスを入れたいかもしれません。私はそれを無視します。

.profileはルートの.bash_profileと同等です。他のシェル(csh、sh、tcsh)でも使用できるように名前が変更されたと思います。 (ユーザーとしては必要ありません)

実行される.bash_logoutもあります、そうだね... logout。あなたはデーモンを止めるか、あるいはちょっとしたハウスキーピングをしたいと思うかもしれません。ログアウト時に画面をクリアしたい場合は、そこに "clear"を追加することもできます。

また、各設定ファイル についての完全なフォローアップがここにあります

これらはおそらくディストリビューションにも依存します。すべてのディストリビューションがそれぞれの設定を持つことを選択するわけではありません。しかし、それらが同じ名前を持つとき、彼らは通常同じ内容を含みます。

7
Filip Ekberg

Josh Staiger によると、Mac OS XのTerminal.appは新しい端末ウィンドウごとにデフォルトで非ログインシェルではなくログインシェルを実行し、.bashrcではなく.bash_profileを呼び出します。

彼はお勧めします:

ほとんどの場合、ログインシェル用と非ログインシェル用の2つの別々の設定ファイルを管理する必要はありません - PATHを設定するときは、両方に適用する必要があります。あなたはあなたの.bash_profileファイルから.bashrcを供給し、それからPATHと共通設定を.bashrcに入れることによってこれを修正することができます。

これを行うには、.bash_profileに次の行を追加します。

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

コンソールからあなたのマシンにログインすると、今度は.bashrcが呼ばれます。

4
Rose Perrone

見るのに良い場所はbashのmanページです。 こちら はオンライン版です。 "INVOCATION"セクションを探してください。

2
PolyThinker

私は.profileを実行するように見えるが.bash_profileは実行しないようなDebianファミリーディストリビューションを使用しました、一方RHEL派生物は.bash_profileの前に.profileを実行します。

あなたがどんなLinux OSでも動くように環境変数を設定しなければならないとき、それは混乱のようです。

0
seismick