Linuxの基本とコマンド

## Linuxとは
[リーナス・トーバルズ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%8A%E3%82%B9%E3%83%BB%E3%83%88%E3%83%BC%E3%83%90%E3%83%AB%E3%82%BA)が開発したオープンソースのUNIX系OSです。
Linuxは本来カーネルを指していたが、Linuxカーネルを含むシステム全体の総称となっている。

Linuxといえば情報リテラシーが高いエンジニアだけが触るOSというイメージがあったが、
現在はWindowsでLinuxの実行環境を容易に導入できることもあり、身近なOSになってきた感があります。
## ディストリビューション
Linuxカーネルに様々なソフトウェアやファイルを追加したもので、Linuxシステムを利用できる状態で提供されたソフトウェアたち。
流派としては「Red Hat系」「Slackware系」「Debian系」に分類されており、各流派の中には様々なディストリビューションが存在します。

[Linuxディストリビューション](https://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

## Linux環境の準備（Windows編）
WSLの導入手順はMicrosoftが公開していますので、下記を参考にインストールしましょう。

[WSL を使用して Windows に Linux をインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/install)

ついでにWindows Terminalも導入しましょう。
ターミナル画面を1つのウィンドウで管理できて便利です。

[Windows Terminal](https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=ja-jp&gl=jp&icid=CNavAppsWindowsApps)


## 基本コマンドについて
利用頻度が高そうなコマンドについて内容と書式をまとめました。
オプションは一部コマンドのみ記載としており、`man`コマンドで適宜確認をお願いいたします。

### man
オンラインマニュアルで使い方を確認する。
コマンドの意味やオプションを知りたい場合は、まずはmanで確認する。
```shell
man コマンド名
```

### cd
ディレクトリを変更する。
ディレクトリ名を指定しない場合はホームディレクトリに変更されます。
```shell
cd [ディレクトリ名]
```

### pwd
現在のディレクトリを表示する。
```shell
pwd
```

### ls
ファイルやディレクトリ情報の一覧を取得する。
ディレクトリを指定することで、ディレクトリ配下の情報一覧を取得する。
```shell
ls [オプション] [ファイル]
```

### mkdir
ディレクトリを作成する。
```shell
mkdir ディレクトリ名
```

### rmdir
空ディレクトリを削除する。
ディレクトリにファイルがあるとエラーが表示され、削除は行われません。
```shell
rmdir ディレクトリ名
```

### cat
ファイルの内容を表示する。
```shell
cat ファイル名
```

### less
ファイルの内容を表示する。
`cat`とは違う点として、ページングしながら確認できる。
```shell
less ファイル名
```

### head
ファイルの行頭を表示する。
デフォルト表示数は10行だが、オプションで表示数の変更可。
```shell
head [オプション] ファイル名
```

### tail
ファイルの行末を表示する。
デフォルト表示数は10行だが、オプションで表示数の変更可。
```shell
tail [オプション] ファイル名
```

### touch
ファイルのタイムスタンプ(更新日時)を変更する。
ファイルが存在しない場合はファイルを新規作成する。
```shell
touch [オプション] ファイル名
```

### rm
ファイルを削除する。
勢いで削除して事故を起こさないためにも、オプションに`-i`をつけて確認すると良さそう。
```shell
rm [オプション] ファイル名
```
| オプション 	| 内容                                     	|
|------------	|------------------------------------------	|
| -i         	| ファイル削除前に確認する                 	|
| -r         	| ディレクトリとそれらの内容を再帰的に削除 	|
| -e         	| ファイル削除後にメッセージ表示           	|
| -f         	| 存在しないファイルを無視                 	|


### mv
ファイル移動。ファイル名の変更も行える。
```shell
mv [オプション] 移動元ファイル 移動先ファイル
```
移動先の同名ファイル上書き等の事故防止のため、積極的にオプションを使った方がよさそうです。
| オプション 	| 内容                                                     	|
|------------	|----------------------------------------------------------	|
| -b         	| 移動先に同名ファイルがあれば、バックアップ取得後に上書き 	|
| -i         	| 移動先に同名ファイルがあれば、上書きしていいか確認する   	|
| -n         	| 移動先に同名ファイルがあれば、上書きしない               	|


### cp
ファイルを複製し、複製したファイルのファイル名を指定できる。
```shell
cp [オプション] コピー元 コピー先
```

### ln
ハードリンクまたはシンボリックリンクを作る。
よく使うファイルをホームディレクトリにおいてあるように扱える。

##### ハードリンク
- ファイルの実体を直接示して共有する
- ハードリンクを削除しても元ファイルは削除されない
- 別ファイルシステムには作成できない

##### シンボリックリンク
- 元ファイルが保管されたパスを示すファイルを作成
- シンボリックリンクを消しても元ファイルに影響なし
- Windowsのショートカットのようなもの

```shell
#ハードリンク
ln 元ファイル名 リンク名

#シンボリックリンク
ln -s 元ファイル名 リンク名

```

### find
ファイルがどこのディレクトリに存在するか検索する。
```shell
find パス -name ファイル名
```

### chmod
ファイルのアクセス権を変更する。
アクセス権とは以下の3つがあります。

- 読み込み権
- 書き込み権
- 実行権

付与する権限のパターンについては以下の通りです。

| 数値 	| 記号 	| 読取 	| 書込 	| 実行 	|
|:----:	|:----:	|:----:	|:----:	|:----:	|
|   7  	|  rwx 	|   ○  	|   ○  	|   ○  	|
|   6  	|  rw- 	|   ○  	|   ○  	|      	|
|   5  	|  r-x 	|   ○  	|      	|   ○  	|
|   4  	|  r-- 	|   ○  	|      	|      	|
|   3  	|  -wx 	|      	|   ○  	|   ○  	|
|   2  	|  -w- 	|      	|   ○  	|      	|
|   1  	|  --x 	|      	|      	|   ○  	|
|   0  	|  --- 	|      	|      	|      	|


```shell
chmod モード ディレクトリ
chmod モード ファイル
chmod 8進数表記のモード ディレクトリ
chmod 8進数表記のモード ファイル
```
### chown/chgrp
ファイルの所有者(ユーザ・グループ)を変更する。
```shell
#所有者の変更
chown ユーザ ディレクトリ
chown ユーザ ファイル
#所有グループの変更
chgrp グループ ディレクトリ
chgrp グループ ファイル
```
### ps
OS内部で実行されているプロセス一覧を表示します。
プロセスID、CPU使用時間、コマンド名、端末番号などを確認できる。

```shell
ps [オプション]
```
`ps u`でプロセス一覧を表示した例です。
CPUやメモリの使用に関する項目があることがわかります。

```shell
$ ps u
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
xxx          348  0.0  0.0   6828  5808 pts/0    Ss   12:24   0:00 -bash
xxx          412  0.0  0.0   6120  4912 pts/1    S+   12:24   0:00 -bash
xxx         2178  0.0  0.0   7480  3196 pts/0    R+   14:44   0:00 ps u
```

### kill
指定したプロセスIDのプロセスを終了させる。
```shell
kill [オプション] プロセスID
```
killコマンドのオプションで使用するシグナルは以下です。
シグナルを誤ると意図しない動作が起きるのでご注意ください。
| 番号 	| シグナル名 	|   動作   	|
|:----:	|:----------:	|:--------:	|
|   1  	|   SIGHUP   	|  再起動  	|
|   6  	|   SIGABRT  	|   中断   	|
|   9  	|   SIGKILL  	| 強制終了 	|
|  15  	|   SIGTERM  	|   終了   	|
|  17  	|   SIGSTOP  	|   停止   	|
|  18  	|   SIGCONT  	|   再開   	|

## 参考
- [Linux標準教科書](https://linuc.org/textbooks/linux/)
- 新しいLinuxの教科書