【初学者用】Linuxを基礎から徹底解説


# はじめに

本記事を閲覧いただきありがとうございます。
都内でSEをしておりますhirokiです。

今回は`「Linuxコマンド」`に関して、解説していけたらと思います。
Linuxに関しては、Macの`「ターミナル」(黒い画面)`にてcdコマンドを叩いたくらいで、ほとんど使ったことがありません。ほぼ初学者です。
加えて、エンジニアになってから`マウスを使わないコマンド操作(CUI)`から徹底的に逃げてきた人間なので、「Linuxコマンド」はちょくちょく仕事で登場していたものの、その場しのぎの対応をしていました。
ただエンジニアになって１年以上が経過し、今後のキャリアを考えると、さすがにヤバいなと思い（遅い）、目を背けていた現実に向き合い、`0からLinuxを体系的に学ぼう！`と思い立ちました。

そこで今回は

* 0からLinuxを学び、記事作成を通じてLinuxを体系的に理解できるようにする
* 自身と同じようにLinuxコマンドに苦手意識を持っている方々へ、`実務に役立つ`情報を提供する

ことを軸にして記事を書き上げました。


どうぞ最後まで閲覧いただけると嬉しいです。

# そもそもLinuxって何？
結論から述べると
**Linuxとは、コンピューターにあれこれ 指示を出して動かすOSの１つ**ことを言います。

順を追って説明していきます。
OS（オペレーティングシステム）というのは、`PCを動かすために必要不可欠な基本ソフト`のことです。
例えば、私たちがPCを使うときに、マウスやキーボードで入力したりファイルの保存やコピーをしたりする操作ができるのはOSがあるおかげです。
言い換えると、**OSが入っていないPCはただの箱**と化してしまいます。

そんなOSにも種類があり
有名なものだと`WindowsOS`や`macOS`、
最近だとスマホの`Android`や`iOS（iPhone）`もそれに当たります。
このOSはよくPC/スマホの`魂`や`人格`に例えられ、機器の中身のOSが異なると、操作等も異なってきます。
普段iPhoneを使用している人がAndroidのスマホを使うと、「なんか慣れない操作で使いにくいな、、、」と思うのは、
中身のOSが異なっていて、操作性も異なるからということになります。
適切な例えか定かではありませんが、下記のように同じ身体の空の器でも、中に入る魂が異なれば、性格が変わるといった感じでしょうか。( 遊⚫︎王をアニメで見た世代はイメージしやすいかもしれないですね。※[^1]）


![スクリーンショット 2023-08-08 13.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/d94fa7d5-4a71-b689-97f0-5c0f09f62085.png)


Linuxはそんな数あるOSの中の１つです。
では一体どんな特徴（性格）のOSなのか次で説明していきます

:::note warn
まとめ
Linuxはその種類によってPCの操作性/動作を決める`OS`の１つ
:::


## Linuxの特徴

下記にLinuxの特徴まとめました。

:::note info
**特徴1**
誰でも無料で使えるオープンソース
:::

:::note info
**特徴2**
型の古いPCなど、機器問わず動作させることが可能
:::

:::note info
**特徴3**
上記より、サーバーに組み込まれて使用されることが多い
:::

:::note info
**特徴4**
操作は基本的にCUI（コマンド）操作
:::

:::note info
**特徴5**
覚えるコマンドやコマンド同士の組み合わせが多く学習コストは高い
:::

:::note info
**特徴6**
枯れている技術※[^2]なので、一度身につけてしまえば、半永久的に使うことができる
:::



上記を踏まえて、
習得までは時間はかかるものの、
`Webエンジニア`として今後キャリアを確立していくならば習得は必須かと思います。
理由として、`サーバー`の90%以上にLinuxが組み込まれており、Linuxコマンドがわかっていないとこちらを操作することに支障が生じるからです。
Webエンジニアが`サーバー`を操作できないというのは話にならないですよね。
「Linuxとか別にやらんで良くね、、、、？」と思ってる方もいるかもしれませんが
結局は私のように後で学習せざる得ない状況になるかと思います。


Webアプリにおけるサーバーの役割に関しては下記参考いただければと思います。


https://qiita.com/hiroki170421/items/9172a7ebbbc803333bc3


一方で、Linuxは過去に多く改良がなされ完成されている技術なので今後仕様変更等があることは考えにくいと言えます。
なので、一度身につけてしまえば、半永久的に使用できることを考えると、一度向き合って学習して習得しない手はないと思います！

ただコマンド数、コマンド同士の組み合わせも多く、学習コストがかかるので時間と労力が必要です。
しかし、このような`地味で面倒で、やればできるけど、みんなやりたがらない`ことは、やればその分だけライバルと差をつけることができます。
この後の章で、`Linuxコマンド`について解説していきますので、一緒に頑張っていきましょう！


:::note warn
まとめ
LinuxはWebエンジニアであるなら習得しないと詰む
学習コストは高いが、一度習得すると、半永久的に使える技術
:::


# 前提知識

Linuxコマンドを解説していく前に、前提知識に関して解説させて下さい。
ここで解説する前提知識は以下２つ

* ディレクトリ
* パス

になります。順番に解説していきます。

## ディレクトリ

### ディレクトリとは
Linuxにおいて**ディレクトリ** とは、`ファイルを保存する場所`のことを言います。
WindowsやMacでいう**フォルダ**がこれに当たります。
この`ディレクトリ`は、ファイル(アプリや文書、音楽、動画、画像等のデータ)を入れておく**入れ物**のようなものだと考えて下さい。
この入れ物を用いて、役割ごとにフォルダを分類し管理しやすくするという訳ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/d27dc56e-37e4-4771-597f-ceb4eb62730b.png)



### ツリー構造

Linuxでは、１つのディレクトリを起点として、木の枝分かれのような形でディレクトリが体系化されています。
これを見た目に倣って**ツリー構造**と呼びます。

![スクリーンショット 2023-08-10 7.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/9817b5dd-b34e-0f51-c2be-f27de8d361b4.png)


### 覚えておきたい特別なディレクトリ

上記で紹介したツリー構造上に配置されてディレクトリですが、それぞれ配置箇所、役割により、いくつか特別なディレクトリがあるので紹介します。

#### ルートディレクトリ
ツリー構造の中で`スタート地点`となる唯一無二のディレクトリ。
ツリー（木）が１つのルート（根）を起点にして複数の枝葉へと広がっていくことに例えてこのように命名されています。

#### ホームディレクトリ
ログイン直後に位置しているディレクトリ。
個々の利用者が自由に使用できるディレクトリで、こちらを使って作業することが多いです。

#### カレントディレクトリ
今、現在自分がいるディレクトリ。
Linuxになれないうちは、現在地のディレクトリが分からなくなりがちなので、
初めの内は常にこのカレントディレクトリを確認して、自分の現在地を明確にしておく必要があります。




## パス

### パスとは
パスとは**スタート起点のディレクトリから、目的地のディレクトリまで辿った道順**のことです。
「path」という英単語が「道・通路」という意味があり、それが命名の由来となっています。

https://ejje.weblio.jp/content/path


下記図の赤枠のように「/(ルート)」からスタートして、「test」までのパスは
`「/home/hiroki/test」`と表すことができます。

![スクリーンショット 2023-08-11 9.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/74a8cab4-0f07-c9c8-a7bd-8f9700f3a8a2.png)





### 絶対パスと相対パス
絶対パスと相対パスは**スタート地点のディレクトリ**によって区別されます。

#### 絶対パス
スタートが**ルートディレクトリ**のパス。
ルートディレクトリは全ディレクトリの起源で唯一無二で１つしかない「絶対的なもの」なので、この名前が付けられてます。
「パスとは」の解説で挙げた`「/home/hiroki/test」`はルートディレクトリをスタート地点にした絶対パスです。
特徴として、曖昧さがなく、正確なのですが、パスが長くなりがちです。
手順書を作成する際など、`正確なパスを指定`したいときは、この絶対パスを使用すると良いでしょう。
普段こちらのパスを使う機会は少ないかと思われます。

#### 相対パス
スタートが**カレントディレクトリ**のパス。
カレントディレクトリはその時々、状況によって異なる「相対的なもの」なのでこの名前が付けられています。
「パスとは」での図を用いて説明すると、カレントディレクトリが「hiroki」にある場合、パスは`「hiroki/test」`となります。
特徴として、`簡潔`にパスを表記できますが、一意性がなく曖昧になりがちです。
自分の手元のPCでパッと操作したいときはこの相対パスを用いると良いでしょう。
今後は絶対パスよりもこちらのパスを用いる機会の方が多いでしょう。






# 基本的Linuxコマンド

前置きが長くなりましたが、ここからついにLinuxコマンドについて解説していきます。
今回は以下、**できる操作ごと**に`４つに分類`してコマンドの解説をしていけたらと考えております。


:::note info
**操作１**
基本操作(表示、移動、生成、削除、コピー)
:::

:::note info
**操作２**
リンクを張る
:::

:::note info
**操作３**
ファイルの権限管理
:::

:::note info
**操作４**
プロセスとジョブの管理
:::

それぞれ紹介していきます。



## 操作１:基本操作

この章ではファイル、ディレクトリの
* 表示
* 移動
* 生成
* 削除
* コピー


についてのコマンドを見ていきます。

ファイルとディレクトリをよく混合してしまう人がいますが、改めて確認すると
`ファイル = アプリや文書、音楽、動画、画像等のデータ`
`ディレクトリ = ファイルを入れるための入れ物`
で役割は異なり、操作コマンドも変わってくるので注意して下さい。


### pwdコマンド

pwdコマンドはカレントディレクトリを表示するためのコマンドになっています。
このコマンドによって、自分の`現在地`を知ることができます。
繰り返しになりますが、Linuxに慣れないうちは、現在地のディレクトリが分からなくなりがちです。
初めのうちは、都度このpwdコマンドを打ち込んで、現在地を確認するようにしましょう。

```Linux:基本書式
$ pwd 　　　//カレントディレクトリを表示する

//具体例
$ pwd

/Users/name/file    #実行結果
```


### cdコマンド
cdコマンドは　（Change Directry）の略で、このコマンドを実行すると、
現在いるディレクトリを変更することができます。


| コマンド | 動作 |
|:-:|:-:|
| cd + ディレクトリパス  | 移動したいディレクトリに移動  |
|  cd .. |  １つ上の階層のディレクトリに移動 |
|  cd ~ | ホームディレクトrに移動  |
|  cd / |  ルートディレクトリに移動 |


### lsコマンド
lsコマンドは、ファイルやディレクトリの**一覧**を表示するためのコマンドです。



```Linux:基本書式
$ ls [オプション][ディレクトリ名/ファイル名]
```
**オプション**を指定することで、表示形式を変更することが可能になります。
「ディレクトリ名/ファイル名」は任意入力で、入力しない場合は、
**カレントディレクトリ**のディレクトリやファイルが一覧で展開されます。

下記が基本的``lsコマンド　+オプション``になります。
| コマンド | 動作 |
|:-:|:-:|
| ls  | カレントディレクトリのフォルダやディレクトリの一覧を表示  |
|  ls -a |  .で始まる隠しファイル等も含めて全てを表示する(a = all) |
|  ls -l |  ファイル権限や更新日時などを長(Long)形式で表示する |
|  ls -t |  ファイルの最新更新日順に並べて表示する(t = time) |
|  ls -r |  逆順に並べて表示する(r = reverse) |

また、上記のオプションでファイルの表示形式を変えることはできても
**ファイル数を絞り込む**ことはできません。
そこで　「＊」や「？」を用いて**ファイルの検索/絞り込み**をすることが可能です。
「*」はファイル名、ファイル形式名での絞り込み
「？」はファイル名、ファイル形式名 +　文字数、一部文字で、より詳細な絞り込みが可能です。


```Linux:具体例
$ ls *.conf 　　　　　//ファイル形式名がconfのものを全て表示
test.conf  ntp.conf   asound.conf //検索結果

$ ls host.* 　　　　　//ファイル名がhostのものを全て表示
host.rb  host.txt   host.html //検索結果

$ ls ???.conf 　　　　　//ファイル形式名がconfでかつファイル名が3文字のものを全て表示
cas.conf  ntp.conf   yum.conf //検索結果

$ ls host.???? 　　　　　//ファイル名がhostでかつファイル形式名が4文字のものを全て表示
cas.conf  ntp.deny   index.html //検索結果

$ ls host.????w 　　　　　//ファイル名がhostでかつファイル形式名が4文字 + 最後の文字がwのものを表示
host.allow //検索結果
```

### catコマンド
catコマンドは**テキストファイル中身**を**全て表示**させるコマンドのことです。
lsコマンドはファイル名、ディレクトリ名だけの情報を広く浅く表示するのに対して、
catコマンドは１つファイルの詳細を深く表示するというイメージですね。
ちなみに、テキストファイル以外の``「画像ファイル」や「音声ファイル」など``には使用することはできません。

```Linux:基本書式
　$ cat [オプション]ファイル名

//オプション
cat -n ファイル名　//行数を表示

```



例として「workディレクトリ」に格納されたテキストファイル「test.txt」の中身の文章を
ターミナルにてcatコマンドを叩いて表示させたので参考までにご確認ください。

![スクリーンショット 2023-08-12 11.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/3daa9bc9-3d91-19cc-1af3-ae727c610277.png)

↓

![スクリーンショット 2023-08-12 11.10.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/b090d33e-957f-a322-9596-e087b181ddcf.png)

### lessコマンド
lessコマンドはファイルの中身を**スクロール**で表示するためのコマンドです。
主に、catコマンドでは表示し切れない**長いファイルの中身**を確認するためのコマンドです。

オプションはほとんど使用することはないので
``less ファイル名``で覚えておけば問題ありません。

またスクロール表示した画面の閲覧操作方法も載せておきますので合わせてご確認下さい。


| コマンド名 | 動作 |
|:-:|:-:|
| f| 1画面下にスクロール  |
| b| 1画面上にスクロール  |
| j　(↓) | カーソルを下に移動  |
| k　(↑)  | カーソルを上に移動  |
| q |  スクロール表示を抜ける |


### findコマンド
findコマンドはファイル、ディレクトリの数が膨大の時に、条件を絞って**検索**し、
目的のファイル、ディレクトリが**どこにあるのか探す**のに便利なコマンドです。

```Linux:基本書式
$ find [検索開始場所のパス][検索条件][検索アクション]

// 具体例
$ find . -name README.md -print  // findコマンド

./wordpress/.../README.md  //　検索結果
```

**$ find . -name README.md -print**
① 「.」:カレントディレクトリを示し、該当ディレクトリ内に**検索範囲**を絞る
② 「-name　README.md」:**検索条件**に[README.mdの名前のもの]を指定。
③ 「-print」:検索結果をターミナルに出力する**検索アクション**

※**「-print」アクション**は、一番よく使われるアクション
※検索アクションを指定しない場合、**自動的に「-print」アクションが適用**される

#### よく使う検索条件

| 検索条件 | 2 |
|:-:|:-:|
|  find -name | 大文字、小文字を区別してファイル名を検索する  |
|  find -iname | 大文字、小文字を区別せずにファイル名を検索する |
|  find -type f |  通常のファイルを検索する |
|  find -type l |  シンボリックリンクを検索する |
|  find -type d |  ディレクトリを検索する |

※シンボリックリンクに関しては**操作2:リンクを張る**で説明します。





### head/tailコマンド
headコマンドはオプション指定しない場合、ファイルの先頭の10行を表示するコマンドで、
tailコマンドはオプション指定しない場合、ファイルの末尾の10行を表示するコマンドです。
双方とも ``-nオプション``で表示する行数を指定することが可能です。


```Linux:基本書式
$ head [オプション]ファイル名  //ファイル中身の先頭一部を表示
$ tail [オプション]ファイル名　　　　//ファイル中身の末尾一部を表示
```

例として、下記のファイルをターミナルにてhead/tailコマンドを叩いて確認しましょう。
![スクリーンショット 2023-08-12 11.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/12d11b32-5f84-0c49-b0d2-7cec60d97edf.png)

**headコマンド(オプション指定無し　先頭１０行表示)**
![スクリーンショット 2023-08-12 12.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/722c9d32-04de-307c-0afe-8ca1c7a26d9d.png)

**headコマンド(オプション　-n5にて先頭5行表示)**

![スクリーンショット 2023-08-12 12.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/2d8d7df7-cca4-20ab-68bb-a281d02eebc9.png)

**tailコマンド(オプション指定無し　末尾１０行表示)**

![スクリーンショット 2023-08-12 12.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/1eb864bc-5adc-e980-435d-efa8e146cb5c.png)

**tailコマンド(オプション　-n5にて末尾5行表示)**

![スクリーンショット 2023-08-12 12.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/42a7eaa9-b950-3aa1-72f9-ac482524646d.png)

#### tail -f(特別なオプション)
ここでtailコマンドの特別なオプションを紹介します。
tailは本来ファイルの末尾を表示するコマンドです。
しかし、ログファイルなどのファイルだと、**終わり部分が随時変わる**ことがあります。
そこで、``-f オプション``を用いることで、変更/更新を**リアルタイムで監視することが可能です。**

```Linux:基本書式
$ tail -f ファイル名　　　　//ファイル中身の末尾一部を表示し、更新分をリアルタイムで表示
```

下記実際にコマンドを叩いた場合の挙動です。参考までにご確認下さい。

![スクリーンショット 2023-08-12 13.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/f9ddce12-610f-1008-1f48-de723e1e2c79.png)

↓


![スクリーンショット 2023-08-12 13.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/8b2456cc-a2ca-73fe-c238-8acf352debc3.png)




### touchコマンド
touchコマンドは**ファイルを新規生成**するためのコマンドです。
コマンドの後にファイル名**複数**指定することで、一度に2つ以上の新規ファイルを作成することが可能です。
また、ファイル名に**既に存在するファイル**を指定した場合、上書きされずエラーになるので、安全なコマンドです。


```Linux:基本書式
$ touch <新規ファイル名１>　<新規ファイル名2>　
//新規ファイル１、新規ファイル2をカレントディレクトリ直下に作成
```
### mkdirコマンド
mkdirコマンドは**ディレクトリを新規生成**するためのコマンドです。
 ``-p オプション``を用いることで、入れ子の深い構造のディレクトリを作成することが可能です。

```Linux:基本書式
$ mkdir [オプション]　<ディレクトリ名>　

//オプション -r
$ mkdir -r test/2023/8
// test/2023/8 →「３階層構造のディレクトリを作成」
```


### rmdirコマンド
rmdirは**空の**ディレクトリを**削除**するコマンドです。
ディレクトリの中にファイルや子ディレクトリがある場合はエラーになるので、誤削除を防ぐことができます。

```Linux:基本書式
$ rmdir 　<ディレクトリ名>　 //　空のディレクトリを削除
```

### rmコマンド
rmはファイルやディレクトリを**完全に削除**するコマンドです。
この　**完全に削除**というのはゴミ箱などに行かず、一度削除したら、**復元不可**という意味です。
なのでこのコマンドを実行する際は十分に注意して実行して下さい。

```Linux:基本書式
$ rm [オプション]　ファイル名　　 //　ファイルを完全に削除
```
オプションを指定しない場合あファイルのみに適用されます。
ディレクトリに適用させたい場合は ``-r``オプションを指定して下さい。
※rmdirコマンドと異なり**中身がある場合も削除**されてしまうので注意して下さい。

下記のオプションをまとめたので合わせてご確認下さい。

| オプション | 動作 |
|:-:|:-:|
| rm -r  |  ディレクトリの削除(中身が有無に関わらず) |
| rm -i  |  ファイルやディレクトリの削除前に確認メッセージ表示 |
| rm -f  |  指定したファイルを強制削除（警告文表示されない） |




### mvコマンド
mvコマンドは、**ファイルを移動**、**ファイル名を変更**するコマンドです。
```Linux:基本書式
$ move [オプション] <移動元>　　　<移動先>
```
上記で、移動元　移動先がファイルかディレクトリかで挙動が変わってくるので注意して下さい。
下記にまとめたので参考までにご確認下さい。

| コマンド | 移動元 | 移動先 | 動作 |
|:-:|:-:|:-:|:-:|
| mv |  既存ファイル名 |  存在しないファイル名 |  ファイル名を上書き |
| mv |  既存ファイル名 | 既存ファイル名  | ファイルの内容を上書き  |
| mv |  既存ファイル名 | ディレクトリ名  |  ファイルの格納先を変更 |
| mv |  ディレクトリ名 |  ディレクトリ名 |  ディレクトリの格納先を変更 |

またオプションで ``-i``を指定することで、
移動や名前の変更を行う前に上書きのメッセージを表示することができます。



### cpコマンド

cpコマンドは**ファイル、ディレクトリをコピー**するコマンドです。
**ディレクトリ**をコピーする場合オプション ``-r``を使用しないとエラーになるので、ご注意ください。

```Linux:基本書式
$ cp [オプション] <コピー元>...<コピー先>
```

| コマンド | コピー元 | コピー先 | 動作 |
|:-:|:-:|:-:|:-:|
| cp |  既存ファイル名 |  存在しないファイル名 |  ファイルの中身を別名で複製 |
| cp |  既存ファイル名 | 既存ファイル名  | ファイルの内容を上書きコピー  |
| cp |  既存ファイル名 | ディレクトリ名  |  コピー先のディレクトリ直下にファイルを複製 |
| cp -r |  ディレクトリ名 |  ディレクトリ名 |  ディレクトリを中身のファイル含め、指定したディレクトリ直下に複製 |

またオプションで ``-i``を指定することで、
コピーを行う前に確認メッセージを表示することができます。








## 操作2:リンクを張る
続いて**リンクを張る**操作を行うためのコマンド**lnコマンド**について解説していきます。
コマンドの前に**リンクを張る**とはどのようなものなのか？下記をご確認下さい。

:::note info
**リンクを張るとは**
ファイルに別名をつけること
「ショートカット」「お気に入り登録」のようなもの(シンボリックリンク)
:::

:::note info
**どのような時にリンクを張るのか**
長いパス名を省略したい時
複数のバージョンを共存させて、最新を区別したい時
:::


例えば、あるファイルが
user/userfile/favoritefile/...../file
と言った形で、ディレクトリの深い構造にある場合、長いパスを入力しなければならないですし、何より分かりにくいですよね。
この問題を解決するのが、`リンクを張る`ということです。
リンクを張ることで、ファイルへのアクセルをより手短に、わかりやすくすることができます。


### ハードリンクとシンボリックリンク

リンクの種類に関しては2種類あるのでそれぞれ説明していきます。

#### ハードリンク
* 1つのファイルの実態に複数の名前を付ける機能
* 元のファイルを削除しても消えない
* 全てのハードリンクがなくなった時に削除される

#### シンボリックリンク
* リンク先のパス名が書かれた特殊なファイルで、あくまでリンク先のファイルが実体
* シンボリックリンクを残したまま、ファイルの実体を削除したり、ファイルを移動すると、ファイルを参照できなくなる
* ``find -l`` コマンドにて検索することができる。



ハードリンクがファイルとの繋がりがより強固なもので、
シンボリックリンクがショートカットキーやお気に入り登録なような、手軽なものだと考えていただければと思います。

#### lnコマンド

| コマンド | 挙動 |
|:-:|:-:|
| ln リンク元ファイル名 リンク名 | ハードリンクを作成  |
| ln -s リンク元ファイル名 リンク名  |  シンボリックリンクを作成 |





## 操作3:ファイルの権限管理

**ファイルの権限管理**とは言い換えると、
``ある特定のファイル対して、どのユーザーにどのような操作を許可するのかを管理``することです。
なぜかファイルの権限管理が必要になるかというと
Linuxは``複数ユーザーがログインして使うことが前提``になっているので安易にファイル内容を見られたり編集したりできないよう**権限を設定**することが必要になってくるからです。

重要なファイルへのセキュリティ性を高めることで、
システムを**安全に使用・管理**することができるようになります。

それでは、これから権限管理のコマンドについて解説を始めていきたいのですが
その前に、必要な前提知識
* オーナーとグループ
* パーミッション

について解説していきたいと思います。

### ファイルのオーナーとグループ
ここではファイルの**オーナーとグループ**に関して解説していきます。

``オーナー``とはファイルの**所有者**のことで、
基本的には**ファイルの新規作成者**が自動的にオーナーになります。

グループとは、ファイルの**所有グループ**のことで、
ユーザーを特定グループに所属させグループに権限を与えることで**複数ユーザーの権限を一括管理**することが可能になります。

``ls -lコマンド``にてファイルのオーナーとグループを確認することが可能です。

```Linux:基本書式
$ ls -l /etc/less
 -rwxr-xr-x. 1 root(オーナー) root(グループ) 158111 8月　15　２０２３　bin/less

//先に記述されるのがオーナーで、後に記述されるのがグループ
//-rwxr-xr-xに関しては後述
```

### パーミッション
パーミッションとはファイルやディレクトリを**誰がどのように操作するのか**定めたものです。
先ほど説明した**オーナー、グループ**に操作権限を与えることを**パーミッション**というわけですね。
``Permisson``の元々の意味が``許可、許諾``という意味で、**ファイルの操作権限を許可する**ということが命名の由来になっています。

https://ejje.weblio.jp/content/permission

オーナーとグループを``ls -lコマンド``で確認した際に、
``「 -rwxr-xr-x」``という謎の文字列が散見されましたが、こちらが**各ユーザに与えれたパーミッション**を示したものです。
下記でその記号に関して説明していきます。

#### パーミッションの記号
| 記号 | 権限 |
|:-:|:-:|
| r | 読み取り(read) |
| w | 書き込み(write)|
| x | 実行(execute) |

#### パーミッション記号の読み方

オーナーとグループの箇所``ls -lコマンド``で出力したパーミッションを例に読み方を確認していきましょう。

```Linux:パーミッション
$ ls -l /etc/less
 -rwxr-xr-x. 1 root(オーナー) root(グループ) 158111 8月　15　２０２３　bin/less
```
ポイントになるのは
「-」以降の9文字「rwxr-xr-x」を**3つずつ区切って**解読していくことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/4b57d141-0165-637c-a276-00ffefba4226.png)


上記のように **「オーナー」「グループ」「その他ユーザー」** の順に配列されており
それぞれ「読み取り(r)」「書き込み(w)」「実行(x)」の順で**権限に有無**を示しています。
**「r,w,x」の記号が表示**されているものに関しては**権限を持っている**状態で、
**「-」が表示**されているものは、**権限がない**ことを示しています。


### chmodコマンド
chmodコマンドは**ファイルのパーミッションを変更**するためのコマンドです。
コマンドの打ち方は
* chmodの後にモードの書式を指定
* chmodの後に8進数3桁で指定

の2通りあります。

なんか難しい言葉が出てきましたが、
**文字指定**による変更がモード書式指定
**数字指定**による変更が8進数指定
だと考えていただければ大丈夫です。

#### モード書式verによるchmodコマンド

モード書式による設定は、chmodの後ろに**オプションのような記号**を記述することで
ファイルのパーミッションを変更することができます

下記が基本書式になります。

```Linux:基本書式
$ chmod [u,g,o,a] [+,-,=] [rwx] <ファイル名>
```

新しい記号``「u,a,o,a」``,``「+,-,=」``が出てきたので、下記ご確認ください。

| 記号 | 内容 |
|:-:|:-:|
| u  |  所有者権限 |
| g  |  グループ権限 |
| o  |  その他ユーザーの権限 |
| a  |  全ユーザーの権限 |

| 記号 | 内容 |
|:-:|:-:|
| + |  権限を新規追加 |
| - |  権限を削除 |
| = |  既存権限を上書き |

```Linux:具体例
$ chmod u+r testfile 

//testfileの所有者権限(u)に読み取り権限(r)を追加(+)する
```


#### 8進数verによるchmodコマンド
8進数とは「0～7」までの数字を使って表現される数の表記記法のことです。
この8進数による設定は、「r,w,x」のパーミッション記号を**数値**に置き換えたものを
chmodの後に組み合わせて指定することで、ファイルの権限変更をすることができます。


**パーミッション記号に対応する数値**

| パーミッション記号 | 数値 |
|:-:|:-:|
| r(読み取り) |  4 |
| w(書き込み) |  2 |
| x(実行)  |  1 |

**数値の組み合わせ方**

割振りたい権限(r,w,x)の数値(4,2,1)を、**足し算**したものを
各ユーザー(オーナー、グループ、その他)ごとに割り振れば、権限を変更することができます。

例えば
オーナーに「rwx(読み取り、書き込み、実行)」
グループに「r-x(読み取り、実行)」
その他に　「r-x(読み取り、実行」
の権限を与えたい場合は下記のようになります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/77384840-38b2-bd57-070d-26f10986dc1f.png)

それぞれ``与えたい権限の数値を足した合計を対応するユーザー順に並べて記述``すれば、
権限を付与することができます。

### chownコマンド
chownコマンドは**ファイルの所有者や所有グループを変更**するためのコマンドです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265379/8a92c4fe-6c72-9ac7-bad2-1d06a5f55af5.png)


```Linux:基本書式
// ファイルの所有者(オーナー)を変更する
$ chown <オプション> [変更先ユーザー名] [ファイル名] 

// ファイルの所有グループを変更する
$ chown <オプション> [：変更先グループ名] [ファイル名]

// ファイルの所有者(オーナー)と所有グループを同時に変更する
$ chown <オプション> [変更先ユーザー名][:変更先グループ名][ファイル名]
```

**所有グループ**を変更したい場合はグループ名の前に``「:」``を記述するようにして下さい。






## 操作4:プロセスとジョブの管理
ようやく最後のコマンドです。あと一息ですので、頑張りましょう！

コマンドについて解説していく前に、プロセスとジョブとは何かについて解説していきます。

### プロセスとは
プロセスとは**１つの実行中のプログラム**のことを指します。
ターミナルにコマンドを打ち込むと、実行ファイルをメモリに格納して、プログラムを実行します。
プロセスはOS全体で統一して管理され、
システムが自動で実行しているプログラムや、他のユーザーが実行しているコマンドを一括して管理します。

実行中のプログラムがどう動いているのか把握しておかないと、
PCに負荷を掛けてる要因が特定できず、PCやメモリに負荷を掛けてしまい、システム不具合に繋がる可能性があります。
特にバックグラウンドで動いているプログラムは、コマンドを打ち確認しないと見るとができないので、注意する必要があります。

### ジョブとは
ジョブとは、**まとめて実行される複数のプロセス**のことを指します。
ジョブは、ジョブを実行するシェルで管理しています。


### psコマンド

上記で解説した、実行中のプロセスを表示するのが**psコマンド**です。

```Linux:基本書式
$ ps [オプション]　　　　　　　　　　//実行中のプロセスを表示する

//具体例
$ ps
 PID    TTY      TIME CMD
 3935  pts/0    00:00:00 ps

// PID:プロセスID  CMD:実行中のコマンド
```
* よく使うオプション

| コマンド | 動作 |
|:-:|:-:|
| aux  | 全ユーザーのプロセスを、詳細情報を合わせて表示 |

### killコマンド
killコマンドは**実行中のジョブやプロセスを終了させるコマンド**のことです。
``「Cntrl + c」``と異なり、停止中やバックグラウンドのプロセス・ジョブを終了させることができます。


```Linux:基本書式
$ kill [オプション] %<ジョブID>
$ kill [オプション]<プロセスID>

//停止中やバックグラウンドで実行中のプロセス・ジョブを停止する。
```



# 終わりに
Linuxに関して、いかがだったでしょうか？
Linuxコマンドは数も組み合わせが多くて覚えるのが大変ですが、
まずはここで紹介した基本的コマンドだけでも、実際に触りながら少しずつ慣れていきましょう。
また、私自身もLinuxについては学習中なので、新たな学びがあるたびに都度この記事を更新していけたらと思っていおります。
ここまで閲覧いただきありがとうございました！









# 参考文献



https://azby.fmworld.net/kids/pc/doyou/72/?kidsfrom=top_whatsnew3

https://wa3.i-3-i.info/word1961.html

https://www.udemy.com/course/unscared_linux/

https://linuc.org/textbooks/linux/

**※本記事で使用しているイラスト/画像は全てフリー素材を使用しています。**

## 脚注 
[^1]: 某大人気カードバトル漫画。アニメ化・映画化もされ全世界にファンがいます。主人公が2つの人格を入れ替えながら戦います。

[^2]:長年改良を重ね、技術として完成しているもの。これ以上改良の余地がなく、仕様変更等があることも考えられにくいので、一度身に着けてしまえば、半永久的に使うことができる。