【Linux】Linuxの基本を理解する

# はじめに
今回は、Linuxについて学んだことをまとめていきます!

# Linuxとは？
Linuxはコンピュータを動かす基本的なソフトウェアであり、オペレーティングシステム（OS）の一種。OSはハードウェアを制御し、ソフトウェアの実行をサポートする。

## Linuxカーネル
Linuxカーネルは、OSの中核部分で、ハードウェアの制御やリソース管理を行うソフトウェア。狭義の「Linux」

## Linuxディストリビューション
Linuxカーネルに基本的なコマンドやアプリケーションを加え、ユーザーが使える形にまとめたものを「Linuxディストリビューション」と呼ぶ。

### 主なディストリビューションの種類
Linuxディストリビューションは大きく2つに分類される。
- **RedHat系**: Red Hat Enterprise Linux, CentOS
- **Debian系**: Ubuntu, Debian GNU/Linux

## シェルとは？
シェルは、Linuxでコマンドを入力する際に、ユーザーとLinuxカーネルの間を橋渡しする役割を持つソフトウェア。シェルを通じて、ユーザーはコマンドを入力し、システムを操作する。

## コマンドが実行される仕組み
1. ユーザーがターミナルでコマンドを入力する
2. シェルがそのコマンドに合致するファイルを探す（通常 `/usr/bin/` など）
3. シェルがLinuxカーネルにそのコマンドを実行するように指示する
4. コマンドの処理結果が画面に表示される

Linuxカーネルは、CPUやメモリなどのハードウェア管理を行うだけでなく、コマンド実行時のプロセス管理も行う

## なぜシェルとカーネルが分かれているのか？
- **シェルの自由選択**: ユーザーは好みのシェルを使うことができる
- **安定性**: シェルがエラーで落ちても、カーネルに影響が少ない
- **役割分担**: Linuxは「1つのプログラムは1つのことをうまくやる」という設計思想があり、シェルとカーネルを分けることで効率的な設計が実現されている

## プロンプトとは？
シェルがユーザーからの入力を待っている状態を示す記号
- 一般ユーザ: `$`
- スーパーユーザ: `#`

プロンプトは、ユーザー名やホスト名とともに表示され、コマンドの入力待ちを知らせる。

## 主なシェルの種類

### 1. **sh**
   - **特徴**: UNIX標準の古典的なシェル。軽量でシンプル
   - **用途**: POSIX互換スクリプトや基本的なシステム管理に使われる

### 2. **bash**
   - **特徴**: sh互換で、最も普及しているシェル。コマンド履歴やタブ補完、スクリプトのデバッグ機能が充実している
   - **用途**: Linuxのデフォルトシェル。日常的な操作やシステム管理に幅広く使用される

### 3. **zsh**
   - **特徴**: bashをベースにし、補完機能やカスタマイズ性が強化された高機能シェル
   - **用途**: 高度なカスタマイズやプラグインが求められる環境で使用される

## Linuxのディレクトリ構成と各ディレクトリの役割

Linuxでは、すべてのファイルやディレクトリはルートディレクトリ（`/`）を頂点とする1つのディレクトリツリーに配置される。複数のディスクがあっても、このディレクトリツリーは1つだけ。各ディスクは、ディレクトリとしてマウント（結合）される。

### 主要なディレクトリとその役割

| ディレクトリ | 役割 |
|:---|:---|
| **/**   | ルートディレクトリ。全てのディレクトリとファイルの頂点となる |
| **/bin**| システム動作に必要な基本的なコマンドの実行ファイルを格納      |
| **/dev**| デバイスファイルを格納。ハードウェアをファイルとして扱うための特殊なファイルが含まれる |
| **/etc**| システムおよびアプリケーションの設定ファイルを格納。Linuxの管理・運用において重要なディレクトリ |
| **/home**| 各ユーザに割り当てられるホームディレクトリ。ユーザーの作業用ディレクトリ |
| **/sbin**| 管理者ユーザ向けのシステム管理コマンドを格納                   |
| **/tmp** | 一時的なファイルを格納。作業中の一時的なデータなどを置くが、定期的に削除されることがあるため、永続的な保存には不向き |
| **/usr**| ユーザーがインストールしたアプリケーションやその関連ファイルを格納。サブディレクトリとして`/etc`や`/bin`に似た構造を持つ |
| **/var**| 変化するデータ（例: ログファイルやキャッシュなど）を格納。頻繁に書き込まれるため、容量管理に注意が必要 |

## コマンドラインとパス名展開

### コマンドライン引数
コマンドの後ろに半角スペースで区切って指定する文字列で、複数の値を指定したり、オプションを付けたりするために使用される。

### パス名展開（ワイルドカード展開）
ワイルドカード（`*`や`?`）を使ってファイル名のパターンを指定することで、複数のファイルを一度に操作できる。

| ワイルドカード | 説明 | 使用例 | マッチする例 |
|:---|:---|:---|:---|
| `*` | 任意の文字列（0文字以上） | `*.txt`         | `file.txt`, `notes.txt` |
| `?` | 任意の1文字               | `file?.txt`     | `file1.txt`, `fileA.txt`|
| `*`で囲む | 任意の位置に指定した文字列を含む | `*data*` | `mydatafile.doc`, `data.csv`|

## `ls`コマンドの主なオプション

| オプション | 説明 | 使用例 |
|:---|:---|:---|
| `-a` | 隠しファイル（`.`で始まるファイル）も表示 | `ls -a` |
| `-l` | ファイルの詳細情報をリスト形式で表示     | `ls -l` |
| `-F` | ファイルの種類を記号で表示               | `ls -F` |

### ファイル種別の記号（`ls -F`使用時）

| 記号 | 種別 |
|:---|:---|
| `/` | ディレクトリ         |
| `*` | 実行可能ファイル     |
| `@` | シンボリックリンク   |
| 無し | 通常のファイル       |

## オプション指定の基本

- **複数のオプション**は、半角スペースで区切って指定する
- **引数を取るオプション**は、そのオプションの直後に引数を渡す。半角スペースは省略できる

### ロングオプション

- `--` で始まり、より説明的な名前で指定する
- 一意に識別できる範囲まで省略可能（例: `--help` を `--h`とするなど）

## まとめ
今回はLinuxについて学んだことをまとめてみました。
etcやvarなどよく目にするディレクトリ名でしたが、どんなファイルが置かれるディレクトリなのか等まで知らなかったり、カーネルやディストリビューションってどう違うのかなど基本的なこともよくわかってなかったので勉強になりました。
とはいえ、他の主要なコマンドやシェルスクリプトやプロセス、ジョブなどまだまだわからないことがたくさんなので引き続き学んでいきたいと思います。

## 参考書籍

https://www.sbcr.jp/product/4815624316/

## 補足
ちなみに上記の書籍ではVirtualBoxでCentOSを動かしていましたが、インストール等面倒だったので私はDockerでCentOSの環境を作ってハンズオン進めています。
参考までに環境構築方法記載しておきます

### DockerでCentOSの環境構築
#### イメージのPULL
```bash
docker pull centos:centos7
```
#### コンテナの起動
```bash
docker run -it -d --name centos7 centos:centos7
```
#### コンテナに入る
```bash
docker exec -it centos7 bash
```

#### 参考記事

https://weblabo.oscasierra.net/docker-centos7/