回答:
/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 -i
for 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によってトリガーされます。