LoginSignup
89
63

bashの設定ファイル(.bash_profile, .bashrc等)がどんなときに読み込まれるかまとめ

Last updated at Posted at 2016-06-15

早見表

場合 /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 x x o
bash -i x x o
bash --login o o o
bash --norc x x x
bash -c ls 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

下図はShell startup scriptsより
image.png

通常の対話ログインシェルの場合

(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 bashINVOCATIONのところに書いてある。

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を仕込んでおくとよい。

おまけ:zshの場合

下記でzshログインシェルの場合に読み込まれるファイルが表示される。

$ zsh --sourcetrace -lis <<<exit

任意の場所で setopt source_trace を実行してもトレース有効化できる。

89
63
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
89
63