.bashrc、.profile、.bash_profileなどの選択[複製]


195

この質問にはすでに答えがあります:

これは恥ずかしいですが、シェルのカスタマイズがで行くべきかどうPOSIXシステムにフルタイムを使用しての多くの年後、私はまだ把握に苦労を持って.bashrc.profileどこか別の場所、または。のようなOS固有の設定ファイルの一部は言うまでもありません.pam_environment

はい、私はドキュメンテーションを通してパズルを解く方法を知っており、各ファイルがロードされているかロードされていないかを学びます。私が思っているのは、特定のタイプのカスタマイズをどのファイルに入れるかを決定する方法について包括的なガイドラインを誰かがまとめているかどうかです。


6
この質問は重複としてマークされるべきではありません。理由は、追加された質問では.profileが利用できないからです。
Premraj

回答:


215

TL; DR:

  • ~/.bash_profile超シンプルで、ロードするだけ.profile.bashrc(その順序で)

  • ~/.profile環境変数(PATHおよび友人)など、bashに特に関連していないものがある

  • ~/.bashrcインタラクティブなコマンドラインで必要なものがすべてあります。コマンドプロンプト、EDITOR変数、使用するbashエイリアス

その他の注意事項:

  • グラフィカルアプリケーションまたはsh(またはbashとして呼び出されるsh)で使用できる必要があるものはすべて、~/.profile

  • ~/.bashrc 何も出力してはいけません

  • ログインシェルのみが利用できるようにする必要があるものはすべて、 ~/.profile

  • ~/.bash_login存在しないことを確認してください。


3
+1、これにより~/.profile、明示的に/ bin / shを実行するGDM / LightDM / LXDMなどのサービスの環境を正しく設定できます。
grawity

12
私の.bashrc出力は非常にたくさんありますが、それについてコメントできますか?特に、グリーティング出力はどこに置くべきですか?
カリモ14

14
@Calimo:対話モードでのみ出力するようにします。を使用してテストできます。[[ $- == *i* ]]つまり、特殊$-変数で「i」を探します。もちろん、bashが.bashrc非対話型モードで読み取るようにコンパイルされているシステムでは、そもそも問題になります。(これは、Debianのではなくアーチである)しかし、それは使用して接続しようとする謎のエラーメッセージの頻繁な原因だsftpか、scpまたは同様のツール。
grawity

4
これで、.bash_loginが存在しないのはなぜですか?それは何をするためのものか?
tedder42 14

11
@ tedder42:.bash_profileおよびと同じ.profileです。ただし、bashは3つのうち最初の1つだけを読み取ります。あなたが持っている場合、つまり.bash_login、両方.profile.bash_profile神秘的に無視されます。
grawity

53

ここ数年、私は無駄に多くの時間を持っていたので、私はしているだけで、10分よりも少しのためにこれを調査します。これが最良のレイアウトであるかどうかはわかりませんが、ほとんどすべての場合に正しく機能するレイアウトです。

要求事項:

  • ~/.profile / bin / shと互換性がある必要があります。これには、bash、dash、kshなど、ディストリビューションが使用することを選択したものが含まれます。

  • 環境変数は、コンソールログイン(「ログイン」シェル)とグラフィカルログイン(つまり、GDM、LightDM、LXDMなどのディスプレイマネージャー)の両方によって読み取られるファイルに配置する必要があります。

  • との両方 ~/.profileを持つことにはほとんど意味がありません~/.bash_profile。後者が欠落している場合、bashは前者を喜んで使用し、bash固有の行は$BASHorのチェックで保護できます$BASH_VERSION

  • 間の分離*profileとは、*rc前者は「ログイン」シェル、後者のためにあなたは、ターミナルウィンドウを開くたびに使用されていることです。ただし、「ログイン」モードのbashはsourceを実行しない~/.bashrcため~/.profile、手動で実行する必要があります。

最も単純な構成は次のようになります。

  • 持っている~/.profile(bashの固有のものを除く)すべての環境変数を設定し、それを、おそらく行または2を印刷し、その後、ソース~/.bashrcそれ以外のsh互換の構文にこだわり、bashのことで実行されている場合。

    export TZ = "Europe / Paris"
    EDITOR = "vim"をエクスポート
    if ["$ BASH"]; それから
        。〜/ .bashrc
    fi
    稼働時間
    
  • 持っている~/.bashrcのチェックでガード、任意のシェル固有の設定を行い、その対話モードのようなもの破壊を避けるためにsftp(bashのは、ロードするためのオプションでコンパイルされたDebianの上~/.bashrcでも非対話型シェルのために):

    [[$-== * i *]] || 0を返します
    
    PS1 = '\ h \ w \ $'
    
    start(){sudoサービス "$ 1" start; }
    

ただし、特定の非対話型コマンド(などssh <host> ls)がスキップするという問題もあります~/.profileが、環境変数はそれらにとって非常に便利です。

  • 特定のディストリビューション(Debianなど)は、その~/.bashrcような非対話型ログインのソースオプションを使用してbashをコンパイルします。この場合、すべての環境変数(export ...行)を別のファイルに移動し~/.environ両方 .profileとからソースすることで、.bashrc2回実行しないようにガードしておくと便利です。

    もし!["$ PREFIX"]; その後、    #または$ EDITOR、または$ TZ、または... 
        。〜/ .environ            #通常、.environ自体が設定する変数
    fi
    
  • 残念ながら、他のディストリビューション(Archなど)については、あまり良い解決策が見つかりませんでした。一つの可能性はで次のように置くことにより、(デフォルトで有効)pam_envのPAMモジュールを使用することです~/.pam_environment

    BASH_ENV =。/。environ         #タイプミスではありません。パスにする必要がありますが、〜は機能しません
    

    その後、もちろん、に更新~/.environunset BASH_ENVます。


結論?シェルは苦痛です。環境変数は苦痛です。ディストリビューション固有のコンパイル時オプションは、非常に大きな苦痛です。


2
最後の段落のための+1が、私は調達好む.profile.bashrcから.bash_profileと維持.profileきれい。
nyuszika7h 14

@ nyuszika7h:私.profile はきれいです、ありがとう。
grawity

1
あなたは、ウィンドウを開くたびに再コメントは、OSXのための他の方法ラウンドであることに注意してください
マーク

1
「両方~/.profileを持つことにはほとんど意味がありません~/.bash_profile。」:私は同意しません。理由についてはダンの回答をご覧ください。
rubenvb 14

@rubenvb関連部分を引用できますか?aのみを持ち、条件付きの-specific部分を.profileガードすることは問題ないと思いbashます。
ケルビン

33

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      |           |      |
+----------------+-----------+-----------+------+

これはいいね。通常を/etc/profile呼び出し/etc/bash.bashrc、を~/.profile呼び出すことに注意することが重要~.bashrcです。だから、効果的に、/etc/bash.bashrcそして~/.bashrc同様に会話型ログインの実行されています。
ウィスバッキー

いくつかのディストリビューションは、(奇妙な結果を伴う)このスキームを上書きするように見えることに注意してください-ここではopenSUSEのために例えば、私のバグレポートを参照してください。bugzilla.opensuse.org/show_bug.cgi?id=1078124
クリスチャンHerenz

ところで 少なくともbashを使用して、bashが次の方法で呼び出されている場合、これらのファイルはいずれも実行されていません/bin/sh
JepZ

@JepZそうですね、それが3番目のコラム「スクリプト」で説明されていることです。
Flimm

1
@Flimmさて、「スクリプト」列は、bash(/ bin / bashなど)を使用して非対話型スクリプトを開始したときに何が起こるかを説明しています。ただし、sh(および/ bin / shは/ bin / bashへのシンボリックリンク)を介してスクリプトを起動した場合、上記のいずれも実行されません(偶数でも実行されませんBASH_ENV)。bashのmanページの関連する段落は、を検索して見つけることができますIf bash is invoked with the name sh
JepZ

20

「包括的な」ガイドラインを提供します。

  • 作り.bash_profile.profileロード.bashrcなどを使用して、それが存在する場合 [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • 他にすべてを入れます.bashrc
  • 心配しないで。
  • 4年ごとに、あきらめて「心配しない」に戻る前に、この質問を10分間研究してください。

編集:誰かがそれを信じて誘惑された場合に備えて、「包括的な」に恐怖の引用を追加しました。;)


3
両方を有する.bash_profile.profileビット冗長です。後者のみが必要です。ただしif [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi、/ bin / shスクリプトからファイルを手動でソースするプログラム(gdm / lightdm)があるため、/ bin / sh-proofにする必要があります。これは、環境が維持され.bashrcないことも意味します。私が何度か難しい方法を見つけたように、「包括的な」ガイドラインは多くのシステムでは機能しないため、-1にする必要がありました。
grawity

問題はありません。私は喜んで-1を支払うだけで、単なる口語的な「包括的」な答えではなく、あなたは確かにそのタイトルを獲得しました。
機械的な魚14

0

私はこれを理解しようとするのをあきらめ~/.shell-setup、他のすべてから入手した1つのスクリプト()を作成しました。

このアプローチには~/.shell-setup、次の2つの機能が必要です。

  1. 繰り返し供給される場合でも、1回のみ実行しますInclude guardsを使用)
  2. 不要な出力を生成しない(出力が正常な場合に検出する)

#1はかなり標準的ですが、シェルスクリプトではあまり使用されません。

#2はややこしい。bashで使用するものは次のとおりです。

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

残念ながら、どうやってそれを思いついたのか、なぜインタラクティブなシェルを検出するだけでは不十分だったのかを覚えていません。


-2

すべてを入れてから.bashrcソース.bashrc.profile

bashのmanページから(OS X 10.9の場合):

ログインシェルではないインタラクティブシェルが開始されると、bashは〜/ .bashrcからコマンドを読み取り、実行します(そのファイルが存在する場合)。これは、-norcオプションを使用して禁止できます。--rcfile fileオプションは、bashに〜/ .bashrcの代わりにfileからコマンドを強制的に読み取り、実行させます

上記のテキストは、すべてが入れられる理由.bashrcです。ただし、ログインシェルを処理する場合は、少し異なる動作があります。繰り返しますが、マニュアルページから引用:

bashが対話型ログインシェルとして、または--loginオプションを使用した非対話型シェルとして起動されると、bashはまずファイル/ etc / profileが存在する場合、ファイルからコマンドを読み取り、実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で探し、存在し、読み取り可能な最初のコマンドからコマンドを読み取り、実行します。--noprofileオプションは、この動作を禁止するためにシェルを起動するときに使用できます。

.profileログインシェル用に読み込まれますが、読み込まれ.bashrcません。すべてのものを複製するの.bashrcは悪いことです。したがって.profile、動作の一貫性を保つために、それを取り込む必要があります。

ただし、無条件にソース.bashrc.profile取得する必要はありません。詳細については、コメントおよびその他の回答をご覧ください。


4
-1、しないでくださいソース.bashrcから.profile。@DanRabinowitzの回答を参照してください。
nyuszika7h 14

少なくとも無条件ではありません。
nyuszika7h 14

[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrcはの甘いワンライナーです.profile
ジョンWHスミス14

@ nyuszika7h、なぜですか?誰もがそうすることを提案しているようです。
パセリエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.