.bashrc、.profile、.bash_profile などの選択

.bashrc、.profile、.bash_profile などの選択

.bashrc恥ずかしい話ですが、POSIX システムを長年フルタイムで使用してきたにもかかわらず、シェルのカスタマイズを、 、または他の場所のどれに配置するべきかを判断するのにまだ苦労しています.profile。 などの OS 固有の構成ファイルについては言うまでもありません.pam_environment

はい、ドキュメントをざっと読み込んで、各ファイルがいつロードされるか、またはロードされないかを知る方法は知っています。私が疑問に思っているのは、特定の種類のカスタマイズをどのファイルに入れるかを決定する方法について、包括的なガイドラインをまとめた人がいるかどうかです。

答え1

要約:

  • ~/.bash_profile非常にシンプルで、ロードして.profile.bashrcこの順序で)

  • ~/.profilePATH環境変数(および関連変数)など、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

答え4

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

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

  1. 繰り返しソースされた場合でも、一度だけ実行してください(ガードを含める
  2. 不要な出力を生成しない(出力が正常かどうかを検出する)

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

2 番目はもっと複雑です。bash で私が使用しているのは次のとおりです。

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

残念ながら、どうしてそんなことを思いついたのか、なぜそんなことを思いついたのかは覚えていない。対話型シェルの検出十分ではありませんでした。

関連情報