コンテンツにスキップ

~/.bash_profile と~/.bashrc と/etc/profile と~/.profile

いつ誰が何を読み込むのか

ログインシェル起動時

ログインシェルとは、ユーザーがシステムにログインするとき起動されるシェルのことを指す。ログインシェルが起動する例は以下である。

  • Ctrl+Alt+F2 などで起動した仮想コンソールからログインするとき
  • 外部の端末から SSH 接続してログインするとき

uml diagram

非ログインシェル起動時

非ログインシェルとは、ユーザーがシステムにログインしたあとに起動されるシェルのことを指す。ログインシェルが起動する例は以下である。

  • デスクトップや VSCode から新しいターミナルを起動するとき
  • デスクトップや VSCode のターミナルから新しいタブを起動するとき
  • su コマンドでユーザーを切り替えるとき
  • bash コマンドで bash を起動するとき

uml diagram

どれに何を書くべきか

色々トラブった結果、自分用に何か環境変数を追加するときは~/.bashrcが安定だと思う。

/etc/profile

システム全体で使用する設定ファイル。全てのユーザーに共通の設定を行いたい場合はこのファイルに記述する。

1 システムに SSH で 100 人のユーザーがアクセスする場合役に立つのかもしれないが、1 システム 1 ユーザーの使い方でこのファイルを書き換えることはないだろう。

~/.profile

各ユーザー個別の設定ファイル。ユーザーがシステムにログインしたときに読み込まれる。

環境変数はここに書くのが良いという意見が多いのだが、個人的には環境変数は~/.bashrcに書いたほうが確実じゃないかと思う。(理由は環境変数は後勝ちで、かつフロー上~/.profileの読み込みの後は~/bashrcが読み込まれるから)

~/.bash_profile

Ubuntu や Raspberry Pi OS では~/.profileが同じ役割を果たすので、使わない。

~/.bashrc

各ユーザー個別の設定ファイルであり、Bash を起動する度に読み込まれる。

エイリアス、関数、プロンプトの設定は~/.bashrcに書く。

~/.bashrc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# エイリアスの設定例
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# 関数の定義例
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# プロンプトの設定例
PS1='[\u@\h \W]\$ '

設定を反映させる

以下のコマンドで編集した~/.bashrcを起動中のシェルに反映させることができる。

1
$ source ~/.bashrc

参考: 実験結果

準備

Raspberry Pi OS の各ファイルの先頭付近に以下を追記する。

/etc/profile
1
echo "/etc/profile opened"
~/.bash_profile
1
echo "~/.bash_profile opened"
~/.bashrc
1
echo "~/.bashrc opened"
~/.profile
1
echo "~/.profile opened"

システムを再起動する。

1
$ sudo reboot

以下、色々な操作をして出力を確認してみる。

LXTerminal を起動したとき

1
2
~/.bashrc opened
$

LXTerminal で新しいタブを起動したとき

1
2
~/.bashrc opened
$

シェル上でユーザーを切り替えたとき

1
2
3
4
5
$ sudo su -
/etc/profile opened
$ su {ユーザー名} -
~/.bashrc opened
$

bash を起動したとき

1
2
$ bash
$ ~/.bashrc opened

外部の端末から SSH 接続したとき

1
2
~/.bash_profile opened
$

~/.bash_profile がない状態で外部の端末から SSH 接続したとき

1
2
3
4
/etc/profile opened
~/.profile opened
~/.bashrc opened
$