【備忘録】シェルのカスタマイズを学ぶ

## はじめに

[Linux の基本操作](https://qiita.com/yuk1_sys/items/c03f77e516edbe9f6b32) に引き続きシェルに関する以下について学んだので、備忘録としてまとめています。

- ログイン、ログアウト時の処理を定義する設定ファイル
- シェルプロンプトのカスタマイズ
- Linuxのファイルシステム
- ハードリンクとシンボリック（ソフト）リンク
- alias コマンドと ln コマンド

#### 対象読者

- 上記の内容を気になっている、もしくは調べている方



## 【復習】 シェルとは

シェルとは、プログラムを実行するためのLinuxカーネルとユーザ間の接続面（bash など）です。

ユーザはシェルからLinuxコマンドを叩き、カーネルがそのコマンドを受け取ってハードウェアに対して適切に処理を行います。

もう少し詳しくフローを記述するならば、

1. カーネル上に [sshd](https://e-words.jp/w/SSHサーバ.html) が TCP の 22 番ポートで接続を待ち受けている
1. ユーザは sshd に対して ssh でログインを要求する
1. bashプロセスが作成され、ログインしたユーザに割り当てられる
1. ユーザは bash(シェル) からLinuxコマンドを実行する
1. カーネルは 実行されたLinuxコマンドを受け取り、ハードウェアに適切に処理を行う

という流れになります。


## ログイン、ログアウト時の設定ファイルについて

ユーザのログイン、ログアウト時に実行する処理を、設定ファイルに記述することでカスタマイズすることができます。

##### /etc/profile

ユーザログイン時に読み込まれるファイルで、全ユーザ共通の設定を書き込みます。

##### ~/.bash_profile

ユーザログイン時に読み込まれるファイル（隠しファイル）で、各ユーザごとに記載します。

##### ~/.bash_logout

ユーザログアウト時に読み込まれるファイル（隠しファイル）です。



## プロンプトの設定変更

`[test@localhost ~]$` のように、シェルの左に記述されているテキストをプロンプトと呼びます。

変数 PS1 にテキストを代入することで、プロンプトの設定を変更することができます。


```text:実行例
[root@ip-172-31-42-223 ~]# PS1="input text: "
input text: 
```

##### プロンプトで利用する特殊文字

特殊文字を代入することで、さまざまな情報をプロンプトに組み込むことができます。

| 特殊文字 | 意味 |
|:-|:-|
| \h | ホスト名 |
| \u | ログイン中のユーザ名 |
| \W | 作業中のディレクトリ名 |
| \t | 24時間の現在時刻（ HH:MM:SS ） |
| \@ | AM、PM つきの時刻|
| \D{format}: | フォーマットを指定した文字 |
| \$(): | () の中にあるコマンドの実行結果 |

##### プロンプトの文字に色をつける

プロンプトの文字色を変更することができます。

`\e[` でカラーを指定するプロンプトの始まりを表し、`\e[m` でカラーを指定するプロンプトの終わりを表します。

また、`;（セミコロン）` 前の数字を 1 にすると明るい色になり、0 にすると暗い色になります。

以下は設定できるカラー一覧です。

| コード | 色 |
|:-:|:-:|
| 0;29m | 黄 |
| 0;30m | 黒 |
| 0;31m | 赤 |
| 0;32m | 緑 |
| 0;33m | 茶 |
| 0;34m | 青 |
| 0;35m | 紫 |
| 0;36m | 水色 |
| 0;37m | 白 |

```shell:実行例
# プロンプトのテキストを [\u@\h \W]\$ とし、暗い青色を設定する
PS1="\e[1;34m[\u@\h \W]\$\e[m "
```



##### プロンプトのバックグラウンドに色をつける

プロンプトのバックグラウンドにも色の変更が可能です。

文字色の変更と同じく、`\e[` でカラーを指定するプロンプトの始まりを表し、`\e[m` でカラーを指定するプロンプトの終わりを表します。

以下は設定できるカラー一覧です。

| コード | 色 |
|:-:|:-:|
| 40m | 黒 |
| 41m | 赤 |
| 42m | 緑 |
| 43m | 黄 |
| 44m | 青 |
| 45m | 紫 |
| 46m | 水色 |
| 47m | 灰色 |

```shell:実行例
# プロンプトのテキストを [\u@\h \W]\$ とし、バックグラウンドの背景色を緑にする
PS1="\e[42m[\u@\h \W]\$\e[m "
```



## ファイルシステムとは

ハードディスク上のデータを管理して、ファイルのようにアクセスをするLinuxのデータ管理方法です。

データをハードディスクから取得する際、ファイルシステムを利用しないとユーザはデータの具体的なアドレスを指定して取得する必要がありました。

しかし、ファイルシステムを利用すると欲しいデータの保存場所は OS 側で管理してくれるので、ユーザは手間なく取得することができるようになります。

Linuxには代表的なディレクトリがあり、それぞれに役割を持っています。

##### 代表的なディレクトリ

| ディレクトリ名 | 役割 |
|:-|:-|
| /bin | 基本コマンドが格納されている |
| /etc | コマンドやアプリケーションなどの設定ファイルが配置される |
| /usr | 共有できて、読込み可能なファイル。基本的なプログラムが配置される |
| /opt | OS作成後に、インストールされるアプリケーションが主に配置される |
| /home | ユーザのホームディレクトリを作成する |
| /tmp | 一時的に容量が大きなファイルを格納する（全ユーザ利用できる） |
| /var | 書き込みや削除などが頻繁にされやすいログファイルが格納されやすい |
| /proc | 起動されたプロセスの情報が格納される。性能等の解析に用いられる |



## ハードリンクとシンボリック（ソフト）リンク

### ハードリンク

ハードリンクは、ファイルの [i ノード](https://e-words.jp/w/inode.html) に対するリンクです。
（ファイルはファイルの i ノードを経由してディスク上の実データにアクセスする）

そのため、以下のような特徴を持ちます。

- コピー元ファイルが削除されてもハードリンクは残り、実データにアクセスできる
- ディレクトリへのリンクは張れない
- バックアップなどに利用される


### シンボリック（ソフト）リンク

シンボリック（ソフト）リンクは、ファイル自体に対するリンクです。

以下のような特徴を持ちます。

- ファイルが削除されると、ディスク上の実データも削除され、データにアクセスできなくなる
- ディレクトリへのリンクでも貼ることができる
- ショートカットなどに利用される


### コマンドについて

ハードリンク、シンボリックリンクを作成するコマンドは `ln` です。
詳しくは [lnコマンド](https://qiita.com/drafts/e16555ee86d6e06ef0b9/edit#ln-コマンド) に記載しています。




## コマンド

[Linuxの基本操作を覚える](https://qiita.com/yuk1_sys/items/c03f77e516edbe9f6b32) に記述していなかったコマンドを書いていきます。

### alias コマンド

コマンドの別名を作成するコマンド

引数なしで実行すると別名登録しているコマンド一覧が表示され、`alias la='ls -a'` のように引数ありで実行するとエイリアスの登録を行います。


### ln コマンド

ハードリンク、シンボリックリンクを作成するコマンド

オプションなしではハードリンクが作成され、オプション `-s` をつけるとシンボリックリンクが作成されます。

また、`ls -il` を実行することで、i ノードに関する情報を確認することができます。
ハードリンクを作成後に `ls -il` を実行し、iノードが同じものを指していることを確認してみてください。



## おわりに

次はシェルスクリプトの基礎について勉強します。
はやくスクリプトで業務効率化ができるようになりたい〜