これは厄介ですが、POSIXシステムをフルタイムで使用してきた長い年月を経ても、シェルのカスタマイズを.bashrc
、.profile
、またはその他の場所で行う必要があるかどうかを判断するのは困難です。 .pam_environment
のようなOS特有の設定ファイルのいくつかは言うまでもありません。
はい、私はドキュメンテーションを詳しく調べ、各ファイルがいつロードされるかどうかを知る方法を知っています。私が思っているのは、特定の種類のカスタマイズをどのファイルに入れるかを決めるための包括的なガイドラインを誰かがまとめた場合です。
TL; DR:
~/.bash_profile
は非常にシンプルで、.profile
と.bashrc
を(この順序で)ロードするだけです。
~/.profile
は環境変数のようなbashに特に関係のないものを持っています(PATH
とその仲間たち)
~/.bashrc
には対話的なコマンドラインに必要なものがすべて揃っています。私の使用のためのコマンドプロンプト、EDITOR
変数、bashエイリアス
他のいくつかのメモ:
グラフィカルアプリケーションORからsh(またはsh
として呼び出されたbash)で利用できるはずのものはすべて~/.profile
に含まれている必要があります。
~/.bashrc
は何も出力してはいけません
ログインシェルだけが利用できるはずのものはすべて~/.profile
に入ります
~/.bash_login
が存在しないことを確認してください。
ここ数年の間、私は浪費する時間がたくさんあったので、私は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 #誤字ではありません。それはパスである必要がありますが、〜は動作しません
それから、もちろん、~/.environ
をunset BASH_ENV
に更新します。
結論?シェルは痛みです。環境変数は苦痛です。ディストリビューション固有のコンパイル時オプションは、お尻のimmensepainです。
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 | | |
+----------------+-----------+-----------+------+
私はあなたに私の「包括的な」ガイドラインを提供します:
.bash_profile
と.profile
が存在する場合は.bashrc
をロードするようにします。 [ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
に入れます。編集:誰かがそれを信じることに誘惑している場合に備えて、「包括的」に怖い引用符を追加しました。 ;)
私はこれを理解しようとすることをあきらめて、私が他のすべてから調達している1つのスクリプト(~/.Shell-setup
)を作りました。
このアプローチでは~/.Shell-setup
に2つの機能が必要です。
シェルスクリプトではあまり使われないかもしれませんが、#1はかなり標準的なものです。
#2はトリッキーです。これが私がbashで使っているものです:
if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
echo "Hello user!" # ... etc
fi
あいにく私はそれを思いついた方法を覚えていない、またはなぜ インタラクティブなシェル を検出するのが十分でなかったか。