早見表
場合 | /etc/profile | ~/.bash_profile | ~/.bashrc | 備考 |
---|---|---|---|---|
物理的な黒い画面からログイン | o | o | o | 仮想コンソール(/dev/tty1)のこと |
sshでログイン | o | o | o | |
ssh ホスト名 ls | x | x | o | bashはsshdから起動されたことを検出し、.bashrcを読み込む。ただし対話的シェルではないのでPS1はセットされない。 |
screenで新しいウィンドウ | x | x | o | |
bash -i | x | x | o | |
bash --login | o | o | o | |
bash --norc | x | x | x | |
sudo -i | o | o | o | |
sudo ls | x | x | x | |
su - | o | o | o | |
su | x | o | x | |
vimの中で:!ls | x | x | x | |
set shellcmdflag=--login\ -c | o | o | o | ※vimでこの設定をして:!lsした場合。 |
BASH_ENV='path_to_bash_profile' | x | o | o | |
#!/bin/bashつきスクリプト | x | x | x | ./hoge.shで起動した場合 |
cronジョブ | x | x | x |
通常の対話ログインシェルの場合
(1) /etc/profileを読み込む。
(2) ~/.bash_profile, ~/.bash_login, ~/.profileの順で見つかったもの1つだけ読み込む。
通常は~/.bash_profileの中で~/.bashrcを読みこむように設定されている(この設定がなければ~/.bashrcは読み込まれない)。
非対話的に1個のコマンド行だけを実行する場合(cron、vimの:!ls、ssh ホスト名 lsなど)
基本的に/etc/profile、~/.bash_profile、~/.bashrcのいずれも読み込まない。
ただし環境変数BASH_ENVがセットされている場合はそのファイルを読み込む。
aliasは展開されない。展開させたい場合はshopt -s expand_aliases
としておく。
ログインシェルの定義
詳しくはman bash
のINVOCATION
のところに書いてある。
A login shell is one whose first character of argument zero is a -, or one started with the --login option.
ログインシェルとは、引数0(argv[0])の1文字目が「-」である場合、または--loginつきで起動された場合をいう。
ログインシェルか判定するには:
shopt | grep login_shell
の出力を見るか、またはshopt -q login_shell
の戻り値を調べる。
ログインシェルの場合:
$ shopt | grep login_shell
login_shell on
ログインシェルでない場合:
$ shopt | grep login_shell
login_shell off
対話的シェルの定義
An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to
terminals (as determined by isatty(3)), or one started with the -i option.
対話的シェルとは、オプションでない引数(例:bash hoge.sh
)がなく、-cもなく、標準入力と標準エラー出力が端末に接続されている場合か、または-iつきで起動された場合をいう。
対話的シェルか判定するには:
$PS1が
セットされているか、または$-
にi
が含まれているかを調べる。
対話的シェルの場合:
$ echo $-
himBH
対話的シェルでない場合:
$ bash -c 'echo $-'
hBc
確認方法
実際に何が読み込まれるかを確認するには /etc/profile, ~/.profile, ~/.bash_profile, ~/.bashrc の先頭に
echo "~/.bashrc loaded"
のようにecho
を仕込んでおくとよい。