非ログインシェルに対して/ etc / profileが呼び出されないのはなぜですか?


51

次のように定義されたログインおよび非ログインシェル:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profileは、konsole(kde)の起動時など、非ログインシェルに対しては呼び出されません。/ etc / profileは、ログインシェルに対してのみ呼び出されます。

何故ですか?この理由を理解したいので、説明してください。

回答:


100

/etc/profile ログインシェルに対してのみ呼び出されるのは、それが特定の目的であるためです。

ログインシェルではない対話型シェルに対してコマンドを実行したい場合、を使用している場合はbash~/.bashrcまたはに配置し/etc/bash.bashrcます。

「プロファイル」ファイルの目的は、ログインシェルに対してのみ実行されるコマンドを含めることです。これらのファイルは次のとおりです。

  • /etc/profile、ログインシェルとして起動したときにすべてのBourne互換シェルbashおよびを含むdash)によって実行されます。

  • のスクリプト/etc/profile.d

    これはBourneスタイルのシェル用ですが、シェル実行可能ファイル自体にはコーディングされていません。むしろ、のコマンド/etc/profileはそれらを呼び出します。たとえば、私のUbuntu 12.04システムで/etc/profileは、次の行が含まれています。

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile ユーザーのホームディレクトリで、ログインシェルとして起動されたときにBourne互換シェルによって実行されます(オーバーライドされない限り、以下を参照)。

  • .bash_profileまたは.bash_loginユーザーのホームディレクトリに。これらは以外のシェルでは無視されbashます。ただし、.bash_profile存在する場合は、代わりにbash実行します .profile。場合は.bash_profile存在しませんが.bash_login存在している、それが代わりに実行されます.profile

    (ただし、.bash_profileまたは.bash_login、存在する場合、*明示的にを呼び出すように記述するのが一般的です.profile。)

    シェル固有のプロファイルファイルの利点は、そのシェルにのみ有効なコマンドまたは構文を含めることができることです。たとえば[[.bash_profile/で評価演算子を使用できます.bash_loginが、それを使用して.profileからdashシェルとしてログインすると、失敗します。

「プロファイル」ファイルの内容

「プロファイル」ファイルには、ログインの開始時に一度だけ実行するコマンドを含める必要があります。(これには、ログインシェルで開始するグラフィカルログインも含まれます。)シェルが対話型の場合、シェルを実行しているユーザーはおそらくログオンしているので、おそらく祖先(それを開始した、または開始したものを開始した、または、それを開始したなど)ログインシェルでした。

次の理由により、コマンドを1回だけ実行したい場合があります。

  1. それをログインごとに複数の時間を実行する理由はありません、それは非効率的で、でしょう
  2. ログインごとに複数回実行すると、望ましくない結果が生成されます。

望ましくない結果が発生する2番目の状況の例として、すべてのユーザーのデフォルトで表示されるこれらの行を検討します~/.profile

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

あなたがSSHで接続し、別のシェルを実行し(たとえばzsh)、ある時点で一時的に戻っbashて環境を維持したいことがわかったので(bash中にもう一度実行したzsh)、mc一部としてシェルを実行するようなプログラムを実行したと仮定しますそのインターフェースの。場合はbin、あなたのホームフォルダに存在し、ユーザー名はjames、あなたのPATH最も内側のシェルでのようなものです:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

これは非効率的であり、(さらに重要なことですが)の内容を理解するのが難しくなりますPATH

ただし、これは決して災害ではありません。私が知る限り、すべての対話型シェルが「プロファイル」ファイルをソースとしていた場合、デフォルトの構成ではひどいことは何も起こりません。ただし、「プロファイル」ファイルの目的はログインごとに1回だけ実行するコマンドを含めることであるため、ユーザーまたは管理者は、ログインシェルの起動時にのみ実行する必要があるコマンドをプロファイルに追加できます。

実行するすべての対話型シェルのコマンドを配置する場所

を使用している場合bash、すべての対話型シェルで実行されるコマンドのファイルがあります。

  • /etc/bash.bashrc
  • .bashrc ユーザーのホームディレクトリ。

これは、最も一般的なコマンドに使用されます

  1. 子シェルではなく、実行されるシェルの環境のみに影響します。または
  2. これがログインシェルでない場合でも実行する必要があります。

たとえば、コマンドラインのタブ補完は一般bashに、ログインシェルであるかどうかに関係なく有効にする必要があります。したがって、これは次のように表示され~/.bashrcます。

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

そこでは、12の両方が適用されます。これは、このシェル内で実行される他のシェルに引き継がれずbash、別のシェルでログインした場合でもタブ補完が機能するはずです。

ログインシェルおよび対話型の非ログインシェルのコマンドを配置する場所

bashログインシェルおよびインタラクティブシェルでログインシェルではないコマンドを使用して実行したい場合は、通常、/etc/bash.bashrcまたはに入力するだけで十分~/.bashrcです。これは、デフォルトでは、ためである、/etc/profile~/.profile明示的に実行します。たとえば、~/.profile次のとおりです。

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(同様に、/etc/profileソース/etc/bash.bashrcbash)。

したがって、対話型bashシェルを起動すると、「プロファイル」ファイルと「rc」ファイルの両方が実行されます(ログインシェルかどうかは関係ありません)。

非対話型シェルで実行するコマンドを配置する場所

おそらく、すべての非対話型シェルを実行するためのコマンドを指定したくないでしょう。それらは、スクリプトが実行されるたびに実行されます(スクリプトが実行するように構成したシェルによってスクリプトが実行される場合)。

これにより、重大な破損が発生する可能性があります。これを行うつもりで、使用しているアカウント以外にシステムに管理者アカウントがない場合は、作成することをお勧めします。間違いを修正しやすくなります。

ではbashシェルが対話型かどうかに関係なく、「rc」ファイルが実際に実行されます。ただし、上部では次のように言います。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

そのため、スクリプトを実行するために実行されるシェルなどの非対話型シェルでもコマンドを自動的に実行する必要がある場合は、それらの行の前にコマンドを追加できます。

ログインシェルの開始

ログインすると、ログインシェルが起動します。それ以降に起動されたシェルをログインシェルとして動作させる場合は、-lフラグ(l oginの略)で起動します。例えば:

別のユーザーとしてログインシェルを起動する場合を除き、ログインシェルを(ログインせずに)起動する最良の方法です。次に、以下を使用します。

  • sudo -ifor rootsudo -s非ログイン、インタラクティブルートシェルに使用)
  • sudo -u username -i すべてのユーザー向け
  • su - usernamerootユーザー用(非ログイン、インタラクティブルートシェルに使用)su username

最初のログインシェルは?

最初のログインシェルは同じであるログインシェル。この回答が「ログインシェル」と言うところはどこでも、「初期ログインシェル」と言うことができます(このセクションは例外で、すでに意味をなさない)。

初期ログインシェルという用語の1つの理由は、ログインシェルも異なる意味で使用されることです。ログオンによって実行されるシェルとして使用されるプログラムを識別するためです。これは、次のことを言うために使用されるログインシェルの意味です。

  • OpenBSDのデフォルトのログインシェルはksh、Ubuntu の場合ですbash。」
  • 「ログインシェルはで変更できますchsh。」

参考文献


4
Stack Exchangeサイトの質問に対する最良の回答の1つ。
マークE.ハーセ

1
>「プロファイル」ファイルには、ログインの開始時に一度だけ実行するコマンドを含める必要があります。(これには、ログインシェルから開始されるグラフィカルログインも含まれます。)いいえ、いいえ、いいえ、いいえ!それは絶対にありません!すべてのbourne風のシェルは、対話型ログインシェルセッションで.profileのみを読み取ります。つまり、-iオプションで起動されたシェル、または制御端末に接続されたシェル(シェルがディスプレイマネージャによって起動された場合はいずれも当てはまりません)。これが当てはまる理由は、このファイルのポイントが環境だけでなくユーザーの端末をセットアップすることだからです。ディスプレイマネージャーtr

エリア、デレクのコメントの残りをここに再現しましたが、上記の切り株を残して、返信の通知を受け取りますが、評判の要件のために返信することはできません。ただし、上記のチャットルームへの書き込みアクセスを彼に許可しました。
セス

1
In bash, the "rc" files are actually run whether the shell is interactive or not. 間違っています。/etc/bash.bashrcは、/ etc / bash.profileによってトリガーされます。
okwap

OKWAPは右、RCファイルは、非対話型シェルで起動されませんが、この本は、より簡潔かつ正確です。
ニックアレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.