.bashrc
恥ずかしい話ですが、POSIX システムを長年フルタイムで使用してきたにもかかわらず、シェルのカスタマイズを、 、または他の場所のどれに配置するべきかを判断するのにまだ苦労しています.profile
。 などの OS 固有の構成ファイルについては言うまでもありません.pam_environment
。
はい、ドキュメントをざっと読み込んで、各ファイルがいつロードされるか、またはロードされないかを知る方法は知っています。私が疑問に思っているのは、特定の種類のカスタマイズをどのファイルに入れるかを決定する方法について、包括的なガイドラインをまとめた人がいるかどうかです。
答え1
要約:
~/.bash_profile
非常にシンプルで、ロードして.profile
(.bashrc
この順序で)~/.profile
PATH
環境変数(および関連変数)など、bashに特に関連しないものが含まれています。~/.bashrc
対話型コマンドラインで必要なものはすべて揃っています。コマンドプロンプト、EDITOR
変数、bashエイリアスなど、私の用途に
その他の注意事項:
sh
グラフィカルアプリケーションまたはsh(またはbashとして呼び出される)で利用できるものはすべて、~/.profile
~/.bashrc
何も出力してはならないログインシェルでのみ利用可能なものはすべて
~/.profile
~/.bash_login
存在しないことを確認してください。
答え2
ここ数年、私は時間を無駄にすることが多かったので、持っているこれについては 10 分以上調査しました。これが最適なレイアウトかどうかはわかりませんが、ほとんどすべての場合に正しく機能するレイアウトであるというだけです。
要求事項:
~/.profile
あらゆる /bin/sh と互換性がある必要があります。これには、bash、dash、ksh など、ディストリビューションが使用する可能性のあるその他のものが含まれます。環境変数は、コンソール ログイン (つまり、「ログイン」シェル) とグラフィカル ログイン (つまり、GDM、LightDM、または LXDM などのディスプレイ マネージャー) の両方によって読み取られるファイルに配置する必要があります。
持つ意味がほとんどない両方
~/.profile
および~/.bash_profile
。後者がない場合、bash は前者を使用し、bash 固有の行は または のチェックで保護でき$BASH
ます$BASH_VERSION
。*profile
との違いは*rc
、前者は「ログイン」シェルに使用され、後者はターミナル ウィンドウを開くたびに使用されることです。ただし、「ログイン」モードの bash は をソースしない~/.bashrc
ため、~/.profile
手動で行う必要があります。
の最も単純な構成は次のようになります。
すべての環境変数(bash 固有のものを除く)を設定し
~/.profile
、おそらく 1 行か 2 行を出力し、bash で実行されている場合はソースを取得し~/.bashrc
、それ以外の場合は sh 互換の構文に従います。エクスポート TZ="ヨーロッパ/パリ" エクスポート EDITOR="vim" [ "$BASH" ] の場合; . ~/.bashrc フィ 稼働時間
シェル固有の設定を実行するがあり
~/.bashrc
、チェックで保護されていますインタラクティブモードDebian のような問題を回避するには(非対話型シェルでもsftp
ロードするオプションを使用して bash がコンパイルされます):~/.bashrc
[[ $- == *i* ]] || 0を返す PS1='\h \w \$' start() { sudo サービス "$1" を開始します。 }
ssh <host> ls
ただし、特定の非対話型コマンド (例) が をスキップするという問題もあります~/.profile
が、環境変数はそれらに対して非常に役立ちます。
特定のディストリビューション(Debianなど)では、bashをそのような非対話型ログイン用にソースするオプション付きでコンパイルします。この場合、すべての環境変数(行)を別のファイルに移動し、それをソースすると
~/.bashrc
便利であることがわかりました。export ...
~/.environ
両方.profile
そして.bashrc
、これを2度実行しないようにガードを付けます。if ! [ "$PREFIX" ]; then # または $EDITOR、または $TZ、または ... 。 ~/.environ # 一般的には.environ自体が設定する変数 フィ
残念ながら、他のディストリビューション (Arch など) の場合、あまり良い解決策は見つかりませんでした。1 つの可能性は、(デフォルトで有効になっている) pam_env PAM モジュールを使用することです
~/.pam_environment
。そのためには、次の行を追加します。BASH_ENV = ./.environ # タイプミスではありません。パスである必要がありますが、~ は機能しません
その後、もちろん
~/.environ
にアップデートしますunset BASH_ENV
。
結論は?シェルは面倒。環境変数も面倒。ディストリビューション固有のコンパイル時オプションは面倒。巨大な面倒な奴だ。
答え3
これを見て下さいShreevatsaR による素晴らしいブログ投稿以下は抜粋ですが、ブログ投稿にアクセスすると、「ログイン シェル」などの用語の説明、フローチャート、Zsh の同様の表が含まれています。
Bash の場合、次のように動作します。適切な列を下に読みます。A、B、C の順に実行します。B1、B2、B3 は、見つかったファイルのうち最初に見つかったファイルのみを実行することを意味します。
インタラクティブログイン インタラクティブな非ログイン 脚本 /etc/profile
あ /etc/bash.bashrc
あ ~/.bashrc
B ~/.bash_profile
B1 ~/.bash_login
B2 ~/.profile
B3 BASH_ENV
あ ~/.bash_logout
C
答え4
私はこれを理解しようとするのをあきらめ、~/.shell-setup
他のすべてからソースを得た 1 つのスクリプト ( ) を作成しました。
このアプローチには、~/.shell-setup
次の 2 つの機能が必要です。
- 繰り返しソースされた場合でも、一度だけ実行してください(ガードを含める)
- 不要な出力を生成しない(出力が正常かどうかを検出する)
#1 はかなり標準的ですが、シェル スクリプトではあまり使用されないかもしれません。
2 番目はもっと複雑です。bash で私が使用しているのは次のとおりです。
if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
echo "Hello user!" # ... etc
fi
残念ながら、どうしてそんなことを思いついたのか、なぜそんなことを思いついたのかは覚えていない。対話型シェルの検出十分ではありませんでした。