Raspberry Pi OS Lite には.bash_profileがない

## 1. はじめに

.bash_profileに〇〇を追記、なんて書かれていると悲しくなります。
ないので作ってあれそれすると色々おかしくなり、もっと悲しくなります。
どうすればよいのでしょうか？

## 2. 結論

`.bash_profile`がない場合、書けといわれたら`.bashrc`の末尾に加えることにしました。

## 3. ある日の/home/pi

```bash
$ ls -al
total 32
drwxr-xr-x 4 pi   pi   4096 Sep 20 18:22 .
drwxr-xr-x 3 root root 4096 May  8 00:57 ..
-rw------- 1 pi   pi   1405 Sep 20 18:19 .bash_history
-rw-r--r-- 1 pi   pi    220 May  8 00:57 .bash_logout
-rw-r--r-- 1 pi   pi   3565 Sep 20 18:00 .bashrc
drwx------ 3 pi   pi   4096 Sep 19 20:13 .gnupg
drwxr-xr-x 3 pi   pi   4096 Sep 20 17:59 .local
-rw-r--r-- 1 pi   pi    851 Sep 20 18:01 .profile
```

## 4. 現状確認

`.profile` `.bashrc`に、開始と終了がわかるよう`echo ${BASH_SOURCE[0]}開始` `echo ${BASH_SOURCE[0]}終了`を加えてみます。

```bash
nano ~/.profile
nano ~/.bashrc
```

`${BASH_SOURCE[0]}`は自分自身のファイル名だそうです。便利ですね。

sshでログインしてみます。

```bash
Last login: xxx xxx xx xx:xx:xx xxxx from xxx.xxx.xxx.xxx
/home/pi/.profile開始
/home/pi/.bashrc開始
/home/pi/.bashrc終了
/home/pi/.profile終了
$
```

`.profile`が最初に実行され、その中で`.bashrc`が呼ばれ、`.bashrc`が終了し、`.profile`が終了しています。

## 5. .bash_profileを作ると

`touch`で作った後、同じように開始と終了がわかるようにします。

```bash
touch ~/.bash_profile
echo 'echo ${BASH_SOURCE[0]}開始' | tee -a ~/.bash_profile
echo 'echo ${BASH_SOURCE[0]}終了' | tee -a ~/.bash_profile
```

sshでログインしてみます。

```bash
Last login: xxx xxx xx xx:xx:xx xxxx from xxx.xxx.xxx.xxx
/home/pi/.bash_profile開始
/home/pi/.bash_profile終了
$
```

なんということでしょう。
今まで読み込まれていた`.profile` `.bashrc`が読み込まれていません。よくないと思います。

`.bash_profile`を消してみます。

```bash
rm ~/.bash_profile
```

sshでログインしてみます。

```bash
Last login: xxx xxx xx xx:xx:xx xxxx from xxx.xxx.xxx.xxx
/home/pi/.profile開始
/home/pi/.bashrc開始
/home/pi/.bashrc終了
/home/pi/.profile終了
$
```

元通りになりました。

## 6. .profileの中身

`.profile`の中身を見ると、`.bashrc`が呼ばれているのが分かります。

```bash
echo ${BASH_SOURCE[0]}開始
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"               # <==== ここ
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi
echo ${BASH_SOURCE[0]}終了
```

よって、`.profile`が呼ばれれば、`.bashrc`は必ず呼ばれます。
ではなぜ、2つに分けるのでしょうか？

## 7. .bashrcしか呼ばれない場合

があるからです。下記の例では、`su`に`-`があるかないかで結果が変わっています。

```bash
$ su - pi
Password: 
/home/pi/.profile開始
/home/pi/.bashrc開始
/home/pi/.bashrc終了
/home/pi/.profile終了
$ shopt login_shell
login_shell     on

$ su pi
Password: 
/home/pi/.bashrc開始
/home/pi/.bashrc終了
$ shopt login_shell
login_shell     off
```

`shopt login_shell` コマンドは、現在のシェルがログインシェルか否かを判定します。
ログインシェルであれば`.profile`が呼ばれていて、そうでなければ`.bashrc`が呼ばれています。

つまり`.bashrc`に記載したものは、ログインシェルでもそうでなくても、確実に実行されるという事だと思います。

であれば、ユーザー固有の何かについては、`.bashrc`の末尾に書けばいいと思います。