3つのファイルをこの順序で読みますか?
.bash_profile
.profile
.bashrc
端末を初めて開くと、これは発生しません。
init.logファイルに添付されているファイルにトレースステートメントがあります。下記をご覧ください。端末を開いた後に起動します。 suコマンドの後にログの場所を表示するコメントを追加しました。
stephen@debian:~$ cat init.log
reading .bashrc
done reading .bashrc
stephen@debian:~$ su - stephen
Password:
stephen@debian:~$ cat init.log
reading .bashrc
done reading .bashrc
#
# after su
#
reading .bash_profile
reading .profile
reading .bashrc
done reading .bashrc
done reading .profile
done reading .bash_profile
stephen@debian:~$
したがって、su - loginは予想されるシーケンスをトリガーしますが、初期ログインではbashrcのみを読み込みます。これは正しいことはできません。どのような状況でこれが起こるのかを説明できる人はいますか?最初の読み込みに予想されるすべてのファイルが含まれるようにbashrcと設定ファイルを変更できますが、問題の原因を見つけてそこから修正することをお勧めします。
答え1
答えは、bashが3つのファイルをすべて探しますが(状況はわずかに異なります)、通常それらのうちの1つだけが実行されるということです。
実行時ログインシェルにログインするsu -
と、システム全体で実行されます(通常、端末にログインしたり、GNOME 端末などを開くときまたは を使用すると、またはように見えて実行されます)。/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
最初それが探しているもの。
Bashのマニュアルページから:
bashがこのオプションを使用して対話型ログインシェルまたは非対話型シェルとして呼び出されると、まず
--login
ファイル/etc/profile
(ファイルが存在する場合)からコマンドを読み取り、実行します。ファイルを読み込んだ後~/.bash_profile
、~/.bash_login
、 を順に探して存在~/.profile
し、読み取れる最初のファイルからコマンドを読み込み実行します。--noprofile
このオプションを使用すると、シェルの起動時にこの動作を無効にできます。
bashがインタラクティブシェル(より具体的にはログインではなくインタラクティブシェル)で実行されている場合は、~/.bashrc
このファイルを読み込んで実行します。
Bashのマニュアルページから:
ログインシェルではなくインタラクティブシェルを起動すると、bashは
~/.bashrc
ファイルが存在する場合にコマンドを読み取り、実行します。--norc
このオプションを使用すると、これを抑制できます。 file--rcfile
オプションはbashが~/.bashrc
。
Linuxディストリビューションがよくすることは、パブリッシュ~/.bash_profile
とファイル~/.profile
を~/.bashrc
互いにリンクして、ファイル間で設定を繰り返すことなく、より一貫した動作をすることです。
たとえば、Debian のデフォルト値には~/.profile
次のコードスニペットが含まれています。
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
したがって、明示的にソースが提供されるため、~/.bashrc
ログインと非ログインの対話型シェルの両方に、このファイルに追加されたカスタムコンテンツが含まれます。