web-dev-qa-db-ja.com

.bashrc、.profile、.bash_profileなどの中から選択する

これは厄介ですが、POSIXシステムをフルタイムで使用してきた長い年月を経ても、シェルのカスタマイズを.bashrc.profile、またはその他の場所で行う必要があるかどうかを判断するのは困難です。 .pam_environmentのようなOS特有の設定ファイルのいくつかは言うまでもありません。

はい、私はドキュメンテーションを詳しく調べ、各ファイルがいつロードされるかどうかを知る方法を知っています。私が思っているのは、特定の種類のカスタマイズをどのファイルに入れるかを決めるための包括的なガイドラインを誰かがまとめた場合です。

189
Avdi

TL; DR:

  • ~/.bash_profileは非常にシンプルで、.profile.bashrcを(この順序で)ロードするだけです。

  • ~/.profileは環境変数のようなbashに特に関係のないものを持っています(PATHとその仲間たち)

  • ~/.bashrcには対話的なコマンドラインに必要なものがすべて揃っています。私の使用のためのコマンドプロンプト、EDITOR変数、bashエイリアス

他のいくつかのメモ:

  • グラフィカルアプリケーションORからsh(またはshとして呼び出されたbash)で利用できるはずのものはすべて~/.profileに含まれている必要があります。

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

  • ログインシェルだけが利用できるはずのものはすべて~/.profileに入ります

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

209
Dan Rabinowitz

ここ数年の間、私は浪費する時間がたくさんあったので、私はhaveをわずか10分以上かけて調べました。これが最良のレイアウトであるかどうかはわかりません。ほとんどすべてのケースで正しく機能するのはただのレイアウトです。

要求事項:

  • ~/.profileは任意の/ bin/shと互換性がなければなりません - これにはbash、dash、kshが含まれます。

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

  • both~/.profile~/.bash_profileを持つことにはほとんど意味がありません。後者が欠けている場合、bashは前者をうまく使用します、そしてbash特有の行は$BASHまたは$BASH_VERSIONのチェックで保護することができます。

  • *profile*rcの違いは、前者は 'login'シェルに使用され、後者はターミナルウィンドウを開くたびに使用されるということです。しかし、 'login'モードでのbashは~/.bashrcのソースにはならないので、~/.profileは手動でそれを実行する必要があります。

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

  • (bash特有のものを除く)すべての環境変数を設定する~/.profileを持っていて、おそらく1行か2行を出力し、それ以外の場合はsh互換の構文を守って~/.bashrcをソースします。

     export TZ = "ヨーロッパ/パリ" 
     export EDITOR = "vim" 
     if ["$ BASH"];その後
     〜/ .bashrc 
     fi 
    アップタイム
    
  • Debianでsftpのようなものが壊れるのを避けるためにinteractiveモードのチェックを守って、シェル固有のセットアップを実行する~/.bashrcを持ってください。非対話型シェルでも~/.bashrc

     [[$  -  == * i *]] || return 0 
     
     PS1 = '\ h\w\$' 
     
     start(){Sudo service "$ 1"開始。 } 
    

しかし、ある種の非対話型コマンド(例えばssh <Host> ls)が~/.profileをスキップするという問題もありますが、環境変数はそれらにとって非常に有用でしょう。

  • ある種のディストリビューション(例えばDebian)は、そのような非対話型ログインのために~/.bashrcを調達するというオプションでbashをコンパイルします。この場合、すべての環境変数(export ...行)を別のファイル~/.environに移動し、それをboth.profileおよび.bashrcから読み込むことが便利です。二度やらないようにしましょう。

    の場合["$ PREFIX"];それから #または$ EDITOR、または$ TZ、または...
     〜/ .environ #一般的には.environ自身が設定するすべての変数
     fi 
    
  • 残念ながら、他のディストリビューション(Archなど)では、あまり良い解決策が見つかりませんでした。 1つの可能性は、(デフォルトで有効になっている)pam_env PAMモジュールを使用することです。~/.pam_environmentに以下を入れることによって:

     BASH_ENV =。/。environ #誤字ではありません。それはパスである必要がありますが、〜は動作しません

    それから、もちろん、~/.environunset BASH_ENVに更新します。


結論?シェルは痛みです。環境変数は苦痛です。ディストリビューション固有のコンパイル時オプションは、お尻のimmensepainです。

50
grawity

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

私はあなたに私の「包括的な」ガイドラインを提供します:

  • .bash_profile.profileが存在する場合は.bashrcをロードするようにします。 [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • 他のすべてを.bashrcに入れます。
  • 心配しないで。
  • 約4年ごとに、あきらめて「心配しないで」に戻る前に、この問題を調査するのに10分かかります。

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

20
Mechanical Fish

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

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

  1. 繰り返し供給される場合でも、一度だけ実行します( ガードを含める を使用)。
  2. 不要な出力を生成しない(出力が正常であることを検出)

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

#2はトリッキーです。これが私がbashで使っているものです:

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

あいにく私はそれを思いついた方法を覚えていない、またはなぜ インタラクティブなシェル を検出するのが十分でなかったか。

0
ShadSterling