回答:
/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回だけ実行したい場合があります。
望ましくない結果が発生する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 ユーザーのホームディレクトリ。これは、最も一般的なコマンドに使用されます
たとえば、コマンドラインのタブ補完は一般bashに、ログインシェルであるかどうかに関係なく有効にする必要があります。したがって、これは次のように表示され~/.bashrcます。
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
そこでは、1と2の両方が適用されます。これは、このシェル内で実行される他のシェルに引き継がれず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.bashrc用bash)。
したがって、対話型bashシェルを起動すると、「プロファイル」ファイルと「rc」ファイルの両方が実行されます(ログインシェルかどうかは関係ありません)。
おそらく、すべての非対話型シェルを実行するためのコマンドを指定したくないでしょう。それらは、スクリプトが実行されるたびに実行されます(スクリプトが実行するように構成したシェルによってスクリプトが実行される場合)。
これにより、重大な破損が発生する可能性があります。これを行うつもりで、使用しているアカウント以外にシステムに管理者アカウントがない場合は、作成することをお勧めします。間違いを修正しやすくなります。
ではbash、シェルが対話型かどうかに関係なく、「rc」ファイルが実際に実行されます。ただし、上部では次のように言います。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
そのため、スクリプトを実行するために実行されるシェルなどの非対話型シェルでもコマンドを自動的に実行する必要がある場合は、それらの行の前にコマンドを追加できます。
ログインすると、ログインシェルが起動します。それ以降に起動されたシェルをログインシェルとして動作させる場合は、-lフラグ(l oginの略)で起動します。例えば:
別のユーザーとしてログインシェルを起動する場合を除き、ログインシェルを(ログインせずに)起動する最良の方法です。次に、以下を使用します。
sudo -ifor root(sudo -s非ログイン、インタラクティブルートシェルに使用)sudo -u username -i すべてのユーザー向けsu - username非rootユーザー用(非ログイン、インタラクティブルートシェルに使用)su username最初のログインシェルは同じであるログインシェル。この回答が「ログインシェル」と言うところはどこでも、「初期ログインシェル」と言うことができます(このセクションは例外で、すでに意味をなさない)。
初期ログインシェルという用語の1つの理由は、ログインシェルも異なる意味で使用されることです。ログオンによって実行されるシェルとして使用されるプログラムを識別するためです。これは、次のことを言うために使用されるログインシェルの意味です。
bash マンページIn bash, the "rc" files are actually run whether the shell is interactive or not. 間違っています。/etc/bash.bashrcは、/ etc / bash.profileによってトリガーされます。