超解説「Linuxってなぁ～に？」な人に読んで欲しい記事

## 前書き
この記事はLinuxを勉強し始めた時の自分のように、**「Linux」** ってどこかで聞いたことあるけど触ったことない、もしくはプログラミング初心者さんに向けて記載しております。

また、少し触ったことあるけどいまいちメリットがわからなかった方にも是非読んで欲しい内容です。

少し長い内容になりますが、基本的なコマンドとそれを理解するのに必要な最低限の知識を詰め込みましたので、是非最後までお付き合いください。

## なぜLinuxを触る必要があるのか
おそらく多くのプログラミング初心者さんは少なからずこの疑問があるはずです。自分もそうでした。ですので、まずはLinuxが何か？そしてなぜLinuxを触るのか？というところから簡単に説明した後に、厳選した **「初心者が覚えるべき操作」** を解説していきたいと思います。

### Linuxとは？
- [x] LinuxはOS(MacやWindows)の一種でコンピューターを動かすための基本的な無料ソフト
- [x] 元々有料だったUNIXの設計思想を受け継ぎ、フィンランドの学生、Linus Torvalds（リーナス・トーバルズ）によって新たに開発されたオープンソースのオペレーティングシステム
- [x] 世界中のサーバーや携帯電話、ネットワークルーターなどの組み込みシステム、IOTデバイスなど様々な用途で使用されている

### Linuxのメリット
- [x] 無料で使える
- [x] 環境依存性が低い(Mac,Win問わず使用可能)
- [x] [Vi操作](https://qiita.com/yama708-hc/items/88b476bbe38f3b85de16)と同様にほとんどの操作がコマンドライン上でマウスを使用することなく可能
- [x] 世界中で使用されていて信頼性が高く、長期間の稼働が可能でセキュリティ面でも優れている

### Linuxのデメリット
- [x] 初めて触る人にとってはハードルが高い。(コマンドライン上で文字入力のみで操作していくから)
- [x] Microsoft Officeが動作しない
- [x] 画像、音楽、動画ファイル編集が苦手

正直デメリットは一つ目がかなり大きいのかなと思います。
今まで、マウス操作してきた初心者さんは、いきなりコマンドライン上で文字だけで操作することがあまりイメージできないですよね。

自分もそうでしたが、基本的なコマンドだけでも覚えるとメチャクチャ効率的だし絶対に覚えるべき！という認識に変わりました。

最初は慣れなくて難しいと思いますが、Vim操作と同じで慣れたら超がつくほど効率的です。

https://qiita.com/yama708-hc/items/88b476bbe38f3b85de16

是非、この記事で基本操作だけでも、**手を動かしながら**ご自分のPCで試してみてください。
実際に手を動かしながらでないと、便利！や効率的！の意味が理解できないからです。

Macの方は`Command + スペースキー`で「Terminal」と打てばコマンドラインが起動できます。
Winの方は**コマンドプロンプト**か**ターミナル**で操作可能ですが、Macと違って文字操作が少し違いますので、無効な操作が出てきた場合は調べながら実施しましょう。

## 必要前提知識
早速コマンド操作の説明に行きたいところですが、コマンドライン操作をする上で**ディレクトリ**と**Path**については最低限知っておかないといけません。

これを理解しておかないと、**知らない外国の土地にGoogleマップなしで放り込まれるような状態**になってしまうので、最低限の知識だけつけておきましょう。


## ディレクトリについて

Linuxではファイルやディレクトリ（フォルダ）は階層構造を持っていて、すべてのファイルやディレクトリは**ルートディレクトリ（/）を起点として配置されています。**

WinだとCドライブやDドライブなど複数の階層構造がありますが、Linuxは**ルートディレクトリを起点としている1つの階層構造しか持っていません。**

例えるとLinuxは一つの木の幹から全てのディレクトリやファイルが枝分かれしていくイメージです。
これがメチャクチャ便利で、根本が1本というシンプルな構造ですのでファイルやディレクトリの配置を頭の中で考えやすくなります。

## Pathについて

### Path（パス）は、ファイルやディレクトリの位置を示すための指定方法です。
先ほど説明した通り、**すべてのファイルやディレクトリはルートディレクトリ（/）を起点として位置を特定できます。** Pathを使うことでコマンドラインから特定のファイルやディレクトリにアクセスしてコマンドを実行できます。

例えば、今までマウスを使用していた方は、 **「デスクトップにある"ユーザー"フォルダを開き、その中にある"2023"フォルダを開き、さらにまたその中にある"資料"というファイルを開いて編集する。」**　という一連の動作が、**すべてコマンドライン上でできてしまう**ということです。


### 絶対パスと相対パス
Pathには**絶対パス**と**相対パス**の2つの種類があります。

1. 絶対パス:
一番元の**ルートディレクトリ（/）を起点に**ファイルやディレクトリの位置を完全に指定する方法です。例: `/home/usr/documents/file.txt`

2. 相対パス
**現在の作業ディレクトリ(現在いる場所)を基準にして**ファイルやディレクトリの位置を指定する方法です。例えば、いま「documents」というディレクトリ内にある「file.txt」というファイルを編集しているとするなら、「documents」が現在いる場所(以降**カレントディレクトリ**という)になります。

この場合の相対Pathは`documents/file.txt`になります。
一つ前の絶対Pathと比較してみましょう。

**絶対Path**は`/home/usr/documents/file.txt`(一番元のディレクトリから見た位置)
**相対Path**は`documents/file.txt`(現在いる場所を基準とした位置)

初心者の方はこの時点で混乱するかもしれませんので、もっと簡単に考えましょう。
例えると **「住所の伝え方」** が違うだけと思ってください。

**東京都港区新橋6-18-5**にいたとして、東京の人と会話している時なら「**新橋6-18-5**」(相対Path)って言えばわかりますよね。でも地方の東京をほとんど知らないひとには「**東京都港区新橋～**」(絶対Path)と言わないと伝わらないのと同じです。

状況によってコンピューターに自分がアクセスしたい場所を伝えるのに、絶対Pathと相対Pathを使い分けないといけないことがあるので覚えておきましょう。

相対Pathを使用することの方が多いかなと思います。


### ディレクトリについて
1. ルートディレクトリ（/）:
Linuxの最上位ディレクトリです。
**すべてのファイルやディレクトリはルートディレクトリ以下に配置されています。**
ここから **/home、/etc、/var、/usr** など、重要なディレクトリが枝分かれしていきます。

2. ホームディレクトリ（/home/ユーザー名）「~(チルダ)」で表せる:
※ このディレクトリの場所を表す階層構造が**Path**ですね。

ホームディレクトリは各ユーザーの個人的なディレクトリです。大体の初心者に馴染みがあるディレクトリかと思います。

例えば**デスクトップ**は`/home/ユーザー名/Desktop`もしくは`~/Desktop`というPathで表せます。
もし、デスクトップに「2023資料」というディレクトリがあったとしたら、`~/Desktop/2023資料`となるわけです。


## 【厳選】初心者が覚えるべき基本的なコマンド

さあ、ここからは「これだけは使いこなせるようにしよう！」というコマンドたちです。
Vim操作と同様に、コマンドの種類や組み合わせを列挙したらキリがないので、厳選して解説いたします。
そして、各コマンドですが、**単体でも使える＋便利なオプション**が存在します。
それらも同時に見ていきましょう。


### 基礎コマンド 1 現在位置の確認(pwd)と場所移動(cd)

|  コマンド |動作説明 |
|:--------:|:-------------|
| `cd` |change directoryの略でディレクトリを移動するコマンド。単体で使用するとホームディレクトリに移動する|
| `cd + ディレクトリPath` | 自分が移動したいディレクトリに移動 |
| `cd -` | 前回いたディレクトリに移動|
| `pwd` | カレントディレクトリの絶対パスを表示 |


### 基礎コマンド 2 コピー(cp)
|  コマンド |動作説明 |
|:--------:|:-------------|
| `cp + コピー元ファイル名 + 新規ファイル名` | ファイルをコピーして新規ファイル作成 |
| `cp + コピー元ファイル名 + 既存ファイル名` | 指定ファイルを既存ファイルに上書き |
| `cp + コピー元ファイル名 + ディレクトリ名` | 指定したディレクトリにファイルをコピー |
| `cp -i` | コピーの際に既存のファイルを上書きする前に確認を求める |
| `cp -r` | ディレクトリを中のファイル等も含めてにコピー |

※ **この`-i`や`-r`がオプションです。この後に続けてコピー元ファイル名などを記載します。**

例)`cp -i test sample`(sampleファイルは既存ファイルだとする)
このコマンドではtestファイルをコピーしてsampleファイルに上書きします。実行される前に確認メッセージが表示されます。

### 基礎コマンド 3 ディレクトリ内確認(ls)
|  コマンド |動作説明 |
|:--------:|:-------------|
| `ls` | 現在いるディレクトリ内にあるファイルやディレクトリの一覧を表示する |
| `ls -l` | ファイル名だけでなく詳細な情報（ファイルの権限、所有者、サイズ、更新日時など）を表示 |
| `ls -a` | 隠しファイルや隠しディレクトリ(ファイル名が.で始まるもの)も含めて、すべてのファイルやディレクトリを表示 |
| `ls -h` | ファイルサイズを読みやすい形式（KB、MB、GBなど）で表示 |
| `ls -t` | ファイルの更新日時順に並べ替えて表示。最新のファイルが上に表示される ※ 通常はアルファベット順|
| `ls -r` | ファイルやディレクトリを逆順に表示 |
| `ls *.ファイル形式` | ファイル名を問わず検索したい**ファイル形式**で表示(*は任意の文字列を表す) |
| `ls ファイル名.*` | ファイル名を問わず検索したい**ファイル名**で表示 |
| `ls ???.ファイル形式` | **ファイル名の文字数を指定して**、検索したい**ファイル形式**で表示(「?」は1文字を表す) |
| `ls ファイル名.???` | **ファイル形式の文字数を指定して**検索したい**ファイル名**で表示 |
| `ls ファイル名.???g` | **gで終わるファイル形式4文字**のファイルを表示 |

「*」や「?」は探したいファイルの情報を知っていて、**条件を絞って検索する**場合に使えます。

※`ls -l`を使用すると以下のように表示されますが、この内容の見方については、後の**Permission(パーミッション)について**で解説しています。

```
-rw-r--r--  1 user1  users  1024 Jul 16 12:00 file1.txt
-rw-r--r--  1 user1  users   512 Jul 16 12:30 file2.txt
drwxr-xr-x  2 user1  users  4096 Jul 16 13:00 directory1
drwxr-xr-x  2 user1  users  4096 Jul 16 13:30 directory2
```
### 基礎コマンド 4 ファイルの中身全表示(cat)、部分表示(head, tail)、閲覧(less)
| コマンド | 動作説明 |
|:--------:|:-------------|
| `cat ファイル名` | ファイルに記載された中身を表示 |
| `cat -n` | テキストファイルの各行に行番号を付けて表示 |
| `head ` | ファイルの先頭から10行表示 |
| `head -n` | ファイルの先頭から指定した行数だけ表示 |
| `head -c` | ファイルの先頭から指定したバイト数だけ表示 |
| `tail` | ファイルの末尾から10行だけ表示 |
| `tail -n` | ファイルの末尾から指定した行数だけ表示|
| `tail -c` | ファイルの末尾から指定したバイト数だけ表示|
| `tail -f` | ファイルを監視し、新しい行が追加されるたびに自動的に更新。主にログファイルなどをリアルタイムで監視するために使用。|
| `less` | 主に長い内容のテキストファイルを閲覧する |

分かりづらい部分を解説していきます。

まず`cat`コマンドで中身が表示できるのは**テキストファイル**だけです。
バイナリファイルはできません。バイナリファイルは「画像ファイル、音声ファイル、実行ファイルなどの**文字コード以外に数値も含むようなファイル**」のことです。

バイナリファイルの先頭や末尾だけ確認したいというときにheadやtailを使うと確認できます。

`head -c 1024 binaryfile.bin`
先頭から1024バイトだけ表示

`tail -c 1024 binaryfile.bin`
末尾から1024バイトだけ表示


次に`less`コマンドでファイルの長い中身を表示した際のページ閲覧操作を紹介します。
こちらはVim操作と同じです。

| キー | 動作説明 |
|:--------:|:-------------|
| `スペース or f` | ひと画面下にスクロール |
| `b` | ひと画面上にスクロール |
| `j` | 1行下に移動 |
| `k` | 1行上に移動 |
| `q` | lessコマンド終了 |

最後に`tail -f`についてです。
このコマンドは非常に重要なコマンドで、例えば、システムログに何かエラーが発生した場合、`tail -f`コマンドは**エラーメッセージをリアルタイムで表示**し、問題の発生をすぐに把握することができます。

自分のPCで確認することも簡単ですのでやってみましょう!

①新規ファイルtest.txtを作成し、中身を空にします。

②`tail -f test.txt`を実行します。
この状態では`tail -f`コマンドがファイルを監視している状態になりますが、ターミナルには何も表示されず入力モードになりません。
※ ここでファイルが開けない場合は、カレントディレクトリがtest.txtと同じディレクトリじゃない場合がありますので`pwd`コマンドで確認しましょう。

③別のテキストエディタなどでtest.txtを開いて何か文章を書き込みます。
例えば、`Hello, this is a test file!`と書き込んだとします。

④書き込みを行った瞬間、リアルタイムでターミナルに`Hello, this is a test file!`が表示されれば`tail -f`コマンドは正常に機能してます。

⑤`Ctrl + C`で`tail -f`コマンドを終了できます。


### 基礎コマンド 5 ファイルの新規作成(touch)

| コマンド | 動作説明 |
|:--------:|:-------------|
| `touch 新規ファイル名` | 新規ファイル作成 |
| `touch 既存ファイル名` | タイムスタンプ更新 | 

`touch`コマンドの便利なところは、間違って**既存ファイル名を打っても上書きされずにタイムスタンプを更新してくれる**ところですね。


### 基礎コマンド 6 ディレクトリ作成(mkdir)、削除(rmdir, rm)

| コマンド | 動作説明 |
|:--------:|:-------------|
| `mkdir 新規ディレクトリ名` | ディレクトリを新規作成 |
| `mkdir -p` | 親ディレクトリも含めて階層的にディレクトリを作成 | ※ 後ほど解説
| `rm ファイル名` | 指定ファイルを完全削除。※ **ゴミ箱には入らず文字通り完全に削除されます** |
| `rmdir` | **空のディレクトリのみ削除。** 中身がある時はエラーがでる |
| `rm -i` | ファイルやディレクトリの削除を実行する前に確認メッセージ表示 |
| `rm -f` | 指定したファイルを強制削除 |
| `rm -r` | 中身のあるディレクトリ削除 ※`rmdir`と似てるので注意|

`mkdir -p`についてですが、例えばデスクトップに「2023ディレクトリ」を作成して、その中に「東京ディレクトリ」、さらにその中に「港区ディレクトリ」を作成したかったとします。

これを一気に作成できるコマンドが
`mkdir -p ~/Desktop/2023/東京/港区`

マウスを使うなら一回一回右クリックして新規作成→名前入力を繰り返さないといけないですよね。


### 基礎コマンド 7 ディレクトリ及びファイル移動(mv)
|  コマンド |動作説明 |
|:--------:|:-------------|
| `mv ファイル名 移動先ディレクトリ` | ファイル名を指定してディレクトリに移動 |
| `mv ディレクトリ名 移動先ディレクトリ` | ディレクトリを指定して移動することも可能 |
| `mv ファイル名 存在しないファイル名` | この場合は名前が変更される |
| `mv ファイル名 既存ファイル名` | この場合は既存ファイルの中身が上書きされる(ファイル名は既存ファイル名のまま) |
| `mv -i` | 上書きが発生する場合に確認メッセージを表示 |

`mv`コマンドはちょっとややこしくなるのでまず以下のことを理解しておきましょう。
- [x] 「大は小を兼ねる」で**移動先にはディレクトリを指定すること**が前提。ファイルにファイルは入らないがディレクトリにはどちらも入る。

- [x] **移動先がディレクトリではない場合「移動」ではない挙動をする。**(上記コマンド表下3つ)
ですので`mv -i`をクセづけるようにしましょう。


## ハードリンクとシンボリックリンクについて
次のコマンド解説に行く前に理解しておかなければいけないのが**ハードリンク**と**シンボリック**です。
ファイルに対してリンク(繋がり)をつける際の言葉ですが、「リンク」と聞いて初心者の人が一番最初に思い浮かべるのはおそらくURLですよね。

でもこの場合の**リンク**はURLではなく **「繋がり」「入口」** というイメージを持ってください。

つまり **「一つのファイルに対して別の入口からアクセスするための繋がりを作る」** ということです。

それぞれのリンクの特徴を以下で説明します。

### ハードリンク
- [x] ハードリンクは**元のファイルと同じデータを指す別名**であり「複製」ではない
- [x] 同じファイルの複数のバージョンやバックアップを作成する目的で、**1つのファイルに複数の別名**をつける(あだ名をつけるようなイメージ)
- [x] **元のファイルが削除されても存在し続ける**
- [x] 同じデータを指しているため、**一方のファイルを変更すると他方のファイルも変更される**
- [x] **同じファイルシステム内でのみ機能する**
- [x] **ディレクトリ**に対しては作れない
- [x] ファイルを削除するためには**作成したハードリンクを含めて全て削除する**必要がある

### シンボリックリンク
- [x] ファイルやディレクトリへの **ショートカット機能**
- [x] 元のファイルが**削除されたり移動される**と参照先が無効になる ※ 元ファイルのPathを参照しているから
- [x] **異なるファイルシステムの間**でも機能
- [x] **ディレクトリとファイルの両方**に対して作れる

なんとなくイメージはつかめたでしょうか？

ハードリンクは言葉の通り元ファイルと繋がりが強い別の入口
シンボリックリンクは間接的な代理店のような入り口で、windowsのショートカットをイメージすればわかりやすいかと思います。


### 基礎コマンド 8 ディレクトリ及びファイルにリンク作成(ln) 

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



### 基礎コマンド 9 ディレクトリ及びファイル検索(find)
|  コマンド |動作説明 |
|:--------:|:-------------|
| `find 検索する開始場所のPath オプション 条件 `  | 指定した場所から条件に一致するファイルやディレクトリを探す |
| `find -name` | 名前を指定して検索 |
| `find -iname`| ファイル名の大文字と小文字を区別せずに検索 |
| `find -type f,d,l` | ディレクトリやファイルの種類を指定して検索 |
| `find -size ±n` | ファイルサイズを基準に検索。+nでnキロバイトよりも大きいもの、-nでnキロバイト以下のものを検索 |

※ ファイルの種類について
f: 通常のファイル
d: ディレクトリ
l: シンボリックファイル

例えばホームディレクトリ(~)以下から`file.txt`という名前のファイルを検索するときは
`find ~ -name "file.txt"`となります。

**-nameで名前指定する際はファイル名を""で囲いましょう**

さらに **基礎コマンド3の`ls`** に出てきた、「*」や「?」を使用するとディレクトリやファイルの情報が曖昧な場合にも検索可能です。

ファイル形式がわからないとき
`find ~ -name "file.*"`

形式はわかるけどファイル名がわからないとき
`find ~ -name "*.txt"`

いろいろ検索して試してみましょう。

## ファイルのPermission(パーミッション: 許可)について

基礎コマンド3の`ls`で表示されるファイルの詳細情報にパーミッション(許可)があります。
ファイルやディレクトリにはそれぞれアクセス権限が決められてて、**誰にどのような権限が与えられているか**を確認したり、また変更できるようにしておくと、
とても便利なので理解しておきましょう。

例えば`ls`で表示された内容が
```
-rwxr--r-- 1 user group 4096 Jul 16 10:00 test.txt
```
だったとしましょう。

これは以下のような内容になります。

| 表示 | 情報説明 |
|:--------:|:-------------:|
| - | ファイルタイプ(-: 通常ファイル、d: ディレクトリ) |
| rwxr--r-- | アクセス権限(r,w,xの3種類) |
| 1 | ハードリンク数 |
| user | 所有者 |
| group | グループ名 |
| 4000 | ファイルサイズ(byte)|
| Jul 16 10:00 | 最終更新日時 |
| test.txt | ファイル名 |



重要な**アクセス権限**についてですが、基礎単語の頭文字を取っただけなので簡単です。
r(4): read(読み取り)
w(2): write(書き込み)
x(1): execute(実行)
-: 権限なし

※ 数値はアクセス権限を変更する際に省略した記載方法として使われます
例えば全ての権限(r,w,e)がある場合は7、rとwだけなら6になります。

そして、この3つのアクセス権限の付与対象者を左から3つずつ区切って下記のように表します。
| rwx | r-- | r-- |
|:--------:|:---------:|:--------:|
| オーナー | グループ | その他のユーザー|
| 7 | 4 | 4 |

数値で記載する場合は足し算して置き換えるてるだけですね。

`chmod 744 ファイル名`
※ 次で解説

そして、このアクセス権限の変更ができるコマンドが次の`chmod`になります。

### 基礎コマンド 10 権限変更(chmod)
| コマンド | 動作説明 |
|:--------:|:------------:|
| `chmod <u,g,o,a> <+,-,=> ファイル名` | 指定したファイルの指定した対象者への権限付与及び削除 |
| `chmod 数値 ファイル名` | アクセス権限を数値で記載して変更 |
| `chown 所有者 ファイルかディレクトリ名` | ファイルの所有者の変更 |
| `chgrp グループ ファイルかディレクトリ名` | 指定したディレクトリ、ファイルの所有グループの変更 |
| `chown -R `| 指定したディレクトリとその中の全てのディレクトリ及びファイルが対象|
| `chgrp -R `| 指定したディレクトリとその中の全てのディレクトリ及びファイルが対象|

オプションの表示は下記のとおりです
u: 所有者(user)
g: 所属グループ(group)
o: その他のユーザー(others)
a: 全ユーザー(all)
+: 権限付与
-: 権限削除
=: 記述した権限にする


分かりづらいと思いますので解説します。

`chmod g+rx sample.txt`
上記のコマンドは、sampleファイルのグループに**読み取りと実行権限**を与えます。

`chmod 744 ファイル名`
先ほど出てきた数値で表したコマンドです。
指定したファイルの所有者に全ての権限、
所属グループに読み取り権限、
その他のユーザーに読み取り権限を付与しています。

`chown alice file.txt`
この場合はfile.txtの**所有者**をaliceに変更

`chgrp developers file.txt`
この場合はfile.txtの**所属グループ**をdevelopersに変更

そしてディレクトリを指定する際に、その中身のディレクトリやファイルの所有者やグループを、一括して全て変更したい場合は`-R`オプションを使います。

例えばusersディレクトリがあったとします。
`chown -R John users`
この場合はusersというディレクトリ及びusersディレクトリに含まれている全てのディレクトリ及びファイルの所有者がJohnに変更されます。


## プロセスとジョブについて(コマンド実行の裏側を理解する)

いよいよラストです！

Linuxコマンドを実行している際に裏側で何が起きているのか？を理解することによって、より効率的にLinuxを使いこなせることができます。また、負荷の高い作業を続けているとCPUやメモリが不足する可能性があり、サーバーのダウンなどに繋がる可能性もあります。

そのような時には不要なコマンドを停止して負荷を下げたり、トラブルシューティングをしなければいけません。

その際に必要になってくる知識がこの**プロセスとジョブ**です。

ここでいう「プロセス」は、コンピューター上で実行中のプログラムのことを指します。
例えば、ターミナルでコマンドを実行すると、そのコマンドは実行ファイルとしてメモリに読み込まれ、CPUがそのプログラムを実行します。

同じコマンドであっても、1つのコマンドを実行するたびに新しいメモリ領域を確保してプログラムが動作します。ただ、そのままだと現在進行形のコマンドが何か？まではターミナル上では確認できません。

それを確認するために使われるコマンドが`ps`です。
`ps`コマンドを使うと、現在コンピューター上で実行されているプロセスの一覧を表示することができます。


### 基礎コマンド 11　プロセス確認(ps) +アルファ(パイプライン、wc, grep)
| コマンド | 動作説明 |
|:--------:|:-------------|
| `ps` | 現在のユーザーに関連するプロセス情報が表示される |
| `ps aux` | すべてのユーザーに関連するプロセス情報が表示される |

例えばコマンドを実行して以下のような情報が表示されたとします。

```
USER      PID  %CPU %MEM  VSZ   RSS 　TTY      STAT 　START   TIME CMD
user1     1234  0.0  0.5 123456 78900 pts/0    S    10:00   0:00 example_program
user1     5678  0.1  0.2 789012 34567 pts/1    R    10:05   0:01 another_program
user2     9101  0.0  0.1 246810 12345 pts/2    S    10:10   0:02 third_program
```
この際の重要な情報は以下の通りです。

PID (Process ID): プロセスID
TTY (Terminal): プロセスが実行されているターミナルまたは端末の名前が表示されます。
STAT (Status): プロセスの状態を示します。R (実行中)、S (スリープ中)、Z (ゾンビ)、T (停止) などがあります。
TIME: プロセスが実行された総時間を示します。
CMD: プロセスを開始したコマンドまたはプログラムの名前が表示されます。

※ **この`ps`で調べたPIDはこのあと解説する「ジョブの停止」をする際に使用します。**

### パイプライン(|)とgrep(Global Regular Expression Print)

続いてジョブの説明です。少し長くなりますが頑張ってください。

ジョブは **パイプラインなどで複数のコマンドをまとめたもの** で、コマンドを書いたときの1行全部がジョブにあたります。

「え？複数のコマンドをまとめる？そんなん知らん！」と思った方、ここで登場するのが**パイプライン**です。

これはめちゃシンプルで、今まで出てきたコマンドを**繋げて実行したい場合**やここで紹介する`grep`というコマンドと一緒によく使用されます。

`grep`は英語の通りで、指定したファイルに対して
 **全体的に(Global)** に
**正規表現(Regular Expression)** で指定した文字列が含まれるかどうかを検索して
**表示(Print)** します。

例えば
`grep "keyword" file.txt | wc -l`
これはfile.txt内から特定の"keyword"という文字列を検索して、さらにその出現回数をカウントする(wc -l)コマンドです。**パイプライン(|)を使用して「検索」と「カウント」2つのコマンドを連続して実行しています。**

`wc`は**word count**の略でテキストファイルの行数、単語数、文字数をカウントするためのコマンドです。オプションの`-l`をつけて、`wc -l`とすることで**行数のみをカウント表示**できます。

`wc sample.txt`とすると、
`10 20 150 sample.txt`と表示されます。
10行、20単語、150字がsample.txtに含まれるとうことです。

そして、この**パイプラインで繋がれた1行全部がジョブ**で、一つ一つの繋がれているそれぞれの基礎コマンドが**プロセス**になります。

`grep "keyword" file.txt | wc -l`は**ジョブが1つ、プロセスは2つ**ということです。

つまりジョブは **「複数のプロセスが繋がったもの」** と考えるとわかりやすいですね。

`ps aux | grep "process_name"`
これはさきほどの`ps`と繋げて実行中のコマンド名を指定することで、プロセス情報の中から"process_name"という文字列のプロセスだけを表示してくれます。
こちらも**1つのジョブと2つのプロセス**です。

このようにパイプラインは基礎コマンドを繋げて1つのジョブを構成するために非常に重要なコマンドです。

以下は、私がハンズオンで勉強していて「これは使えるな」と思ったコマンドです。

`ls | sort`
ファイルやディレクトリをリストアップして、名前順にソート

`ls | grep "keyword"`
ファイルやディレクトリをリストアップして、キーワードに一致するものだけ表示

`find ~/Desktop/mac/ -type f | grep "keyword"`
特定のディレクトリ内でファイルやディレクトリを検索して、キーワード一致するものだけを表示

`cat file.txt | grep "pattern"`
ファイルの内容を表示して、キーワード一致する行だけを表示

などなどおそらく組み合わせは無限にあると思いますが、初心者の私が紹介できるのはこのくらいです(;'∀')


そしてこのジョブを終了させるコマンドが`kill`になります。

### 基礎コマンド 12 ジョブの終了(kill)
| コマンド | 動作説明 |
|:--------:|:-------------|
| `jobs` | ジョブID、実行状況、実行コマンドを表示 |
| `kill %ジョブID` | ジョブやプロセスを終了させる |
| `kill PID` | プロセスIDを指定してプロセスを終了 |
| `kill プロセス名` | プロセス名を指定してプロセスを終了 |

これは非常にシンプルなコマンドですが、`kill`コマンドと一緒に**ジョブID**や**PID(プロセスID)** が必要になるというのがポイントです。


まずジョブIDを調べるために`jobs`コマンドを実行すると以下のように表示されます。

```
[1]-  Running   sleep 60 &
[2]+  Stopped   find / -name "*.txt" > output.txt &

```
上記の[1]や[2]が**ジョブID**です。
これを使用してジョブを終了させるのに`kill %ジョブID`を使うと、

`kill %1`
`kill %2`　となって各ジョブが終了します。

## 最後に

非常に長い内容でしたが最後までありがとうございました。

Linux操作はVim操作と同じで、一回で覚えられるものではありませんし、自分で普段から使って身につくものなのです。これを機に、いつもマウスで行っていて操作をコマンドライン上でパパパッとできるようにしちゃいましょう！

3日もやれば便利さ、快適さを十分に感じることができるはずです。