初めてUnix(Linux)について学びました。

#今回の記事
初心者が初めて、Unixを学びましたので重要な要点をまとめて、定着を兼ねてアウトプットしていきます。同じような初心者の方に微力ながらお力に慣れたら幸いです。
#Unixとは？Linuxとの違いは何？
Unixと勉強するとLinuxという言葉も目にすると思います。根本的には同じ**OS**です。ここで初心者からしたらそもそも"OS"って何？という感じだと思うのでその説明からしたいと思います。

* OS
 * Operation System(オペレーション・システム)の略で、アプリやデバイスを動作させるための基本となるものである。
 * これがないとパソコンやスマホは動かないもの、身体でいう脳のような役割を担っているものです。

**OS**には様々な種類があり、以下の表でまとめてました。

| OS名| 用途 |
|:-:|:-:|
|  android | スマートフォンをハードウェアとする  |
| iOS  |  iphoneをハードウェアとする　|
| Windows  |  PCをハードウェアとする |
| Mac OS  | PCをハードウェアとする  |
|  Unix | サーバーをハードウェアとする  |
| Linux  |  PCまたは、サーバーをハードウェアとする |
何個か聞いたことがあるものがあったと思います。これらの1種にUnixやLinuxは含まれます。それぞれで特徴を持っています。

* **Unix**
 * 現存するOSの中でもっとも古いOSです。
 * OSの安定性は高く、ネットワーク機能に優れている。なので、大型な計算機やネットワークサーバーのOSとしてはUnixが圧倒的に多くなっています。
 * CUIベースのOS

* **Linux**
 * Unixを参考に０から作られているOSです。パソコン、スマホなど多くに使用されている。
 * フリーソフトウェアとして公開されていて、誰でも自由に開発したり、配布したり、使ったりできます。
 * 独自の構成や設定で配布している企業などが多く、その配布形式を**ディストリビューション**と呼ばれています。
 * 低い性能のコンピューターでも軽快に動作します。
 * CUIベースのOS

２つの紹介の中であったCUIとはインターフェイスのことでGUIの2種類があります。
**GUI**　：　ファイル操作がグラフィカルに表現されているインターフェイスのことです。マウスやトラックボード、タッチパネルなどを用いて操作を可能にします。

**CUI** ：　情報の表示を文字によって行い、全ての操作をキーボードを用いて行うインターフェイスのことです。命令コマンドを打つことによって、ファイルの操作やアプリケーションの起動を行います。

今まで述べた２つの特徴の共通点をまとめると

* **高い信頼性と安定性**
* **CUIベースのOS**
* **企業のサーバーOSとして使用されている**

ということがわかる。最後に異なる点は？だが大きく言えるのは、

* **Unixは企業が開発して、知的財産権が企業に属しているということ**
* **Linuxはオープンソースソフトフェアで配布や使用は自由**

という点が挙げられるということがわかりました。
#カーネルとシェル

* **カーネル**

Unixとは、CUIベースのOSと説明しましたが、コマンドを入力しそこで表示された結果からまたコマンドを入力するというサイクルで操作します。これらの様々な処理を行なっているのがカーネルです。カーネルが管理している機能を用いて、ユーザーは様々なことができているのです。しかしカーネルは処理を行なっているだけで、解釈や実行を行なっているのは別にあります。それが**シェル**です。

* **シェル**

ユーザーとカーネルの間に存在していて、カーネルの周りを覆うようにいるためシェルと呼ばれています。何をしているのかというと、ユーザーが操作を行い入力したコマンドは一旦、シェルが受け取り解釈しカーネルがわかるようにコマンドを実行し処理を依頼している。そして、その結果を解釈し、画面に出力するという役割を持っています。
#ユーザーとグループ

* **ユーザー**
 * 管理者（root）ユーザー
 * 一般ユーザー

Unixは、１台のコンピューターで複数のユーザーが利用でき、最初にログインしなければなりません。そのため、特定のユーザーを識別するために、**ユーザーID**がある。そしてこれは、ログイン名やアカウント名が割り当てられ、それによってもユーザーを識別することができます。また、ユーザーは**管理者ユーザー**と**一般ユーザー**に分けられます。**管理者ユーザー**はコンピューターの最大権限を持っており、全てのコマンドの実行、ディレクトリへのアクセス権、システムの管理、設定を行うことができる。そのため、ミスをしないように、役割ごとに**一般ユーザー**を設定するのが一般的です。

* **グループ**

上記で述べた通り、ユーザーは複数あります。また、ユーザーごとに持っている権限が異なったり、使用できるディレクトリが異なります。そのためシステム上管理しやすくするために**グループ**という機能があります。ユーザーは必ず１つのグループに所属していて、また複数のグループに所属することもできます。
#アクセス権
アクセス権とは、全てのファイルやディレクトリにはどのユーザーに対してどのような操作が行えるかという設定のことです。アクセス権には3種類ありファイル、ディレクトリのアクセス権限が表記により異なります。

| アクセス権 | 概要 |
|:-:|:-:|
| r  |  read。ファイル、ディレクトの読み取りが可能という意味。（内容の表示、ファイル名の表示など） |
|  w |  write。ファイル、ディレクトリの書き込みが可能という意味。（編集やコピー、新規ファイル作成など） |
| x  |  execute。ファイルの実行が可能という意味。ただしディレクトリは実行ではなく、開くことが可能という意味になる。 |

```
$ ls -l : アクセス権の確認をする
```
上記の``ls``コマンドのオプション``-l``で表示されるアクセス権は以下の通りです。

```
-rx-r--r--
```
上記のアクセス権の見方ですが、1番左の``-``はファイルの種別、そこから続く９文字は３文字区切りにで分けられます。左から**所有者のアクセス権、グループのアクセス権、その他ユーザーのアクセス権**となります。

* ファイルの種別
 * ``-``はファイル
 * ``d``はディレクトリ
 * ``l``はリンク 
 
#PATHとは？
PATHとは環境変数の名前です。じゃあ環境変数って何？という感じだったので調べました。環境変数を理解するにはまず、Unixの変数について理解する必要があるのでこちらから説明したいと思います。

* **まずそもそも変数とは？**

変数とは、プログラムを実行する際、シェルからプログラムへ情報を渡す１つの方法です。プログラムに置いてメモリなどに用意するデータを記憶させるための箱のようなものができます。すなわち、プログラムによって値を記憶させた箱が変数であると言えます。

* **Unixの変数**

Unixの変数は、大まかに**環境変数**と**シェル変数**に分かれます。プログラムでは特定の変数を見つけるためにある環境の中で見つけます。それがこの2種類となる。

* **シェル変数**

一時的な作業のためにその場のシェルで使用されるもの。

* **環境変数**

こちらはより重要な役割を持ち、その他の変数はそのプロセス内でのも有効なのに対して、**環境変数はその他のプロセスと共有できる**という特徴があります。また環境変数の名前は大文字で作成するのが慣習的であります。そしてこの環境変数の中にPATHというディレクトリがあります。
ここからが最初の疑問のPATHとは何かの説明をしたいと思います。

* **PATH**

PATHとは、シェルがコマンドを検索するべきディレクトリのことです。Unixではコマンドを打った時そのコマンドを実行ファイルから検索し、特定の値を見つけ実行しています。例えば、以下のような時

```
$ pwd
```
これは現在のディレクトリの位置を示すコマンドですが、これは省略された書き方であって本来は

```
$ /bin/pwd
```
というように書きます。これはPATHの中にあるbinのディレクトリの中のpwdを実行してねという意味を表しています。しかし、PATHの中にあるものは省略して書いてもいいので``$ pwd``と書いているのです。また、PATHは新たに追加したりすることができます。その時使用するコマンドが下記になります。

 ```
$ export PATH=/***/user/
```

```
$ export PATH=/***/user/:$PATH
```
まず１つ目が上書きするコマンドで他のものは削除され、上書きする形なので使用に注意が必要です。２つ目は既存のものを残しつつ、文末に追加するというコマンドです。なので通常、使用する時はほとんどの場合、２つ目が多いと思います。
#リダイレクション 
Unixのシェルはコマンドの入力や出力を切り替える**リダイレクション**機能を持っている。Unixでは入力は普通はキーボードからされて、出力は普通は画面からされる。これが各々、標準入力と標準出力と呼ばれている。

* **標準入力と標準出力**

わかりやすいように実際の例で説明すると

```
$ echo Hello_World
Hello_World
```
文字列を表示する``~$ echo``を使用し、2行目で表示されている文字列が標準出力となります。標準入力はそのままの入力です。
次に標準出力のリダイレクトについての説明をしていきたいと思います。

```
$ echo Hello_World > Hello_World.txt
```
上記のようにすると何も表示されずにプロンプトが戻ってきます。そして

```
$ cat Hello_World.txt
```
とすると中身に文字列が保存されて標準出力を``.txt``にリダイレクトしたことになります。さらにここから同じように``>``を使用して文字列を入れると既存の文字列は消え、上書きされる。なので既存のデータを残しつつ、追加したい場合は``>>``を使用します。
次に標準入力のリダイレクトについて説明いきます。

```
$ cat Hello_World.txt
aaaa
bbbb
cccc
dddd
```
というファイルがあるとします。

```
$ grep "cccc" < Hello_World.txt
cccc
```
とすると``.txt``からccccの文字列を探し出してくれる。これはコマンドの標準入力にファイルを流し込んでいるということになります。
#パイプライン
パイプラインとは、コマンドの入出力を次のコマンドに引き渡すという処理を行うことを指します。コマンドとコマンドをつなぐ際は``|``を間に入れ使用します。例えば、以下のような例が挙げられます。

```
$ ls -l | sort -r
```
これは``ls``コマンドの結果を``sort``コマンドで逆順した結果を返してくれます。パイプラインは、コマンドをつなげていくだけで、数に限りはないためいくつでも連結ができるが、だいたい３つくらいで事足りることがほとんどです。
#学習を終えて
これまで使用してきたOSとは違い、コマンドで全ての処理を行うということにあまりイメージが湧きませんでしたが一通り終えてみて自分でも扱えるかもしれないと思えて来れて、これからの業務の幅が広げられる可能性が増えてとても達成感がありました。学習をしてきた中で一番苦労したのは、PATHの部分です。コマンドが数あるディレクトリの中の特定のファイルの１つから検索されて、なおかつexportを使い新たなものを追加し、使用できるというが想像できず理解に苦しみました。簡単に言えばシェルが探すところに自分が使うコマンドを新たに置くものと考え、理解できました。自分のわかりやすい解釈で理解すると効率的に学習を進めることができるので難しい言葉で考えず、自分がわかるように学習を進めていきます。