【Linux】シェル変数、オプションを理解してbashの設定をカスタマイズする

## はじめに
今回は、Linuxの勉強をする中で、Bashの設定ファイルを編集し、カスタマイズする方法を学んだので、実際にやっていきます！

## 前提知識
まず、Bashの設定をカスタマイズするために必要な基本的な知識を簡単に説明していきます。

### シェル変数
シェル変数とは、Bash内部で使用される変数で、数値や文字列などさまざまな値を設定できます。

#### シェル変数の設定方法
```bash
<変数名>=<値>
```

#### 注意点
1. シェル変数を設定する時は、`=`の左右にスペースを含めてはいけません。スペースがあると、変数名をコマンドとして認識してしまいます。
   ```bash
   <変数名> = <値>   # スペースがあるとエラーになります。
   ```

2. 値にスペースを含めたい場合は、`'` または `"` で囲む必要があります。
   ```bash
   hoge="foo foo" 
   ```

#### シェル変数の参照方法
```bash
echo $<変数名>
```
変数名の前に`$`を付けることで、その中身を参照できます。

### シェル変数の用途
Bashには、特別な意味を持つシェル変数があらかじめ定義されています。これらの変数に値を設定することで、シェルの動作をカスタマイズすることができます。

### 特別な意味を持つシェル変数
以下は、よく使われる特別なシェル変数の一覧です。

| シェル変数名  | 内容                                                                 |
|---------------|----------------------------------------------------------------------|
| `HISTFILE`    | コマンド履歴が保存されるファイルのパス（通常 `~/.bash_history`）       |
| `HOME`        | ユーザーのホームディレクトリのパス                                    |
| `PWD`         | 現在の作業ディレクトリ                                                |
| `OLDPWD`      | 以前の作業ディレクトリ（`cd`で移動する前のディレクトリ）              |
| `SHELL`       | 現在のシェルのパス（例: `/bin/bash`）                                |
| `PATH`        | コマンドが検索されるディレクトリのリスト（`:`で区切られている）       |
| `USER`        | 現在ログインしているユーザー名                                        |
| `LOGNAME`     | システムにログインした際のユーザー名                                  |
| `TERM`        | 端末の種類（例: `xterm-256color`）                                   |
| `PS1`         | プロンプトの表示形式（通常は `\u@\h:\w\$` など）                     |
| `HISTSIZE`    | 保存されるコマンド履歴のエントリ数                                   |
| `HISTFILESIZE`| コマンド履歴ファイルに保存されるエントリ数の最大値                    |
| `EDITOR`      | デフォルトのテキストエディタ（例: `vim` や `nano`）                  |
| `LANG`        | システムのロケール設定（例: `en_US.UTF-8`）                          |
| `LC_ALL`      | すべてのロケール設定を上書きするロケールの指定                        |
| `UID`         | 現在のユーザーのユーザーID                                            |

### `PS1` 〜プロンプトの設定を保持するシェル変数〜
`PS1`は、プロンプトの表示を設定するシェル変数です。

#### 例
```bash
PS1="hogepiyo> "
```
これにより、プロンプトが通常の`$`から`hogepiyo>`に変更されます。

##### 特別な意味を持つ記号
プロンプト設定には、特定の情報を表示するための特殊記号が用意されています。以下にいくつか例を挙げます。

| 記号  | 説明                                       | 例                                           |
|-------|--------------------------------------------|----------------------------------------------|
| `\u`  | ユーザー名                                 | `user`                                       |
| `\h`  | ホスト名（短縮形式）                       | `hostname` の最初の部分                      |
| `\w`  | 現在の作業ディレクトリ                     | `/home/user`                                 |
| `\A`  | 現在時刻（24時間表記、HH:MM形式）           | `15:42`                                      |
| `\$`  | 権限に応じたプロンプト記号（通常は `$`、rootユーザーなら `#`） | `$` または `#`                               |

#### 実際の設定例
```bash
PS1="hogepiyo \A \w \$ "
```
これにより、プロンプトには時刻と作業ディレクトリ、プロンプト記号が表示されます。

```
hogepiyo 17:23 ~/Applications $>
```

## 本題：bashの設定のカスタマイズを行う
一時的に設定を変更するだけでは、シェルを閉じた後にリセットされてしまいます。プロンプトの表示やオプションの設定などを永続的に保持したい場合は、Bashの設定ファイルに記述する必要があります。

### bashの設定ファイルの読み込み順序
Bashの設定ファイルは、以下の順序で読み込まれます。

#### ログインシェルとして起動した場合
1. `/etc/profile`（システム全体の設定）
2. `~/.bash_profile`（各ユーザー個別の設定）
3. `~/.bashrc`（さらに読み込まれる場合が多い）

#### 非ログインシェルとして起動した場合
1. `~/.bashrc`

基本的には`~/.bashrc`に記述するようです！
ほとんどのディストリビューションではデフォルトでbash_profileの中で./bashrcを読み込む処理が記載されているようですね。

### bash設定ファイルの編集手順
#### 1. バックアップを取る
```bash
cp ~/.bashrc ~/.bashrc.org
```
誤って必要な設定を消してしまったりした時のためにバックアップをとっておきましょう！

#### 2. 予備のシェルを開いておく
誤ってシェルを壊した場合に備えて、別のシェルを開いておくとさらに安全です！

#### 3. 設定ファイルを編集する
`~/.bashrc`に設定を追記します。
今回は、以下のようにしてみました。
各設定の意味はコメントに記載しました。

```bash
# プロンプトの設定
PS1='[\u] \w \t \$ '  # ユーザー名、ワークディレクトリ、現在時刻、プロンプト記号を表示

# オプションの設定
shopt -s dotglob      # ドットファイルもlsで表示
shopt -s cdspell      # cdでのスペルミスを訂正
shopt -s histappend   # 履歴を追加
HISTSIZE=10000        # 保存する履歴数
HISTFILESIZE=10000    # 履歴ファイルの保存数

# エイリアスの設定
alias ls='ls -F'
alias la='ls -a'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
```

### 4. 設定を反映させる
シェルを再起動するか、以下のコマンドで設定を反映させます。
```bash
source ~/.bashrc
```

### まとめ
以上、Bashの設定ファイルを編集してカスタマイズする方法について説明しました。
ちょっとしたことですけど、めちゃくちゃ便利になりますね。
まだまだ知らないオプションとかもたくさんあるので、日々使用する中で、設定を追加していきながら、使いやすくしていきたいです！

### 参考書籍

https://www.kinokuniya.co.jp/f/dsg-01-9784815624316